Incrustar un .exe dentro de un formulario .

Iniciado por **Aincrad**, 11 Octubre 2017, 02:33 AM

0 Miembros y 1 Visitante están viendo este tema.

**Aincrad**

hola a todo. bueno tengo el siguiente problema:  :huh:

si yo quiero meter un .exe dentro de un formulario y ejecutar ese .exe incrustado
con un botón como podría hacer eso?  si alguien sabe algún code para realizar esto.

                                  Gracias de antemano  :D





MCKSys Argentina

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


**Aincrad**

no me funciona.  :( no me abre. si sirve de algo yo uso vb 2008 gracias de todas maneras.




MCKSys Argentina

El ejemplo está en C#.

Pasar de C# a VB.NET es muy simple (incluso hay herramientas que lo hacen automáticamente).

Con respecto a que el IDE no abre el proyecto: puedes mirar el source. En la página te da una idea de cómo funciona la cosa.

Es cuestión de que leas un poco y te pongas a hacer pruebas.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


**Aincrad**

otra preguntilla.

yo tengo este código que crea un bat según el texto que tenga en un texbox:

Código (vbnet) [Seleccionar]
Dim ruta As String = "usb.bat"
            Dim escritor As StreamWriter
            escritor = File.AppendText(ruta)
            escritor.Write(TextBox1.Text)
            escritor.Flush()
            escritor.Close()


bueno el problema es que al crear el batch lo crea con codificación UTF-8 y lo que quiero es que lo cree con codificación ANSI , Como le hago?




Eleкtro

#5
Cita de: **Aincrad** en 11 Octubre 2017, 04:22 AM
otra preguntilla.

Código (vbnet) [Seleccionar]
...
Dim escritor As StreamWriter
escritor = File.AppendText(ruta)
...


bueno el problema es que al crear el batch lo crea con codificación UTF-8 y lo que quiero es que lo cree con codificación ANSI , Como le hago?

Tómate 1 minuto de tiempo para revisar la parametización de las sobrecargas del constructor de la clase StreamWriter y te prometo que hallarás la respuesta a tu pregunta por tus propios méritos y en muy poco tiempo...

( Ni siquiera tienes que hacer el esfuerzo de buscar en Google ni en MSDN, basta con que uses las funcionalidades de IntelliSense en la ventana del editor de código de Visual Studio para ir analizando las sobrecargas y leer la descripción/propósito de cada parámetro... )

PD: Si no lo consigues averiguar o no me has entendido bien entonces dímelo y te diré la solución, pero esto deberías aprenderlo por ti solo por que es una pregunta que no debería hacer falta preguntar si te hubieras esmerado en leer por 1 minuto las sobrecargas...




Cita de: **Aincrad** en 11 Octubre 2017, 02:33 AMmeter un .exe dentro de un formulario y ejecutar ese .exe incrustado

Imagino que a lo que realmente estás intentando referirte es que quieres embedir o simplemente agregar un executable a tu executable compilado, bien, en ese caso sencillamente puedes agregar el executable deseado a la tabla de recursos de tu proyecto, puedes hacerlo desde la pestaña "Recursos" en las propiedades del proyecto:


Una vez hayas agregado el executable, se serializarán los bytes dentro del archivo resources.resx (este archivo representa el contenido de la tabla de recursos .NET de tu programa).

Tienes dos modos de ejecutar en tiempo de ejecución el executable agregado como recurso:

--- EL SIGUIENTE CÓDIGO HA SIDO EXTRAIDO Y OFRECIDO DE FORMA GRATUITA A PARTIR DE MI FRAMEWORK COMERCIAL ELEKTROKIT FRAMEWORK , EL CUAL CONTIENE UNA INFINIDAD DE UTILIDADES ENFOCADAS A UNA AMPLIA VARIEDAD DE TEMÁTICAS Y ESCENARIOS EN LA PROGRAMACIÓN .NET, COMO ÉSTE. SI QUIEREN CONOCER MÁS ACERCA DEL PRODUCTO, MIREN MI FIRMA DE USUARIO EN EL FORO. ---

1. Extrayendo los datos raw (bytes) del recurso/executable y escribirlos en un archivo local en el disco:

Código (vbnet) [Seleccionar]
#Region " Imports "

Imports System.IO

#End Region

#Region " Resource Util "

Namespace ElektroKit.Core.Application.Resources.Tools

   Partial Public NotInheritable Class ResourceUtil

#Region " Public Methods "

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Extracts a resource to disk.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <example> This is a code example.
       ''' <code>
       ''' ExtractResourceToDisk(My.Resources.MyTextfile, "C:\File.txt")
       ''' </code>
       ''' </example>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <param name="resource">
       ''' The resource to extract.
       ''' </param>
       '''
       ''' <param name="filepath">
       ''' The target filepath where to save the resource data.
       ''' </param>
       '''
       ''' <param name="overwrite">
       ''' If set to <see langword="True"/>, overwites any existing file,
       ''' otherwise, and if the file already exists, a <see cref="IOException"/> exception is thrown.
       ''' </param>
       ''' ----------------------------------------------------------------------------------------------------
       <DebuggerStepThrough>
       Public Shared Sub ExtractResourceToDisk(ByVal resource As Byte(),
                                               ByVal filepath As String,
                                               ByVal overwrite As Boolean)

           Dim fileMode As FileMode
           If (overwrite) Then
               fileMode = FileMode.Create
           Else
               fileMode = FileMode.CreateNew
           End If

           Dim bufferSize As Integer = 8192 ' 8 kb.
           Using fs As New FileStream(filepath, fileMode, FileAccess.Write, FileShare.Read, bufferSize)
               fs.Write(resource, 0, resource.Length)
           End Using

       End Sub

#End Region

   End Class

End Namespace

#End Region


Modo de empleo:
Código (vbnet) [Seleccionar]
ResourceUtil.ExtractResourceToDisk(My.Resources.Program1, "C:\Program1.exe", overwrite:=True)
Process.Start("C:\Program1.exe", arguments:="")


2. Siempre y cuando el executable sea un ensamblado .NET, entonces puedes utilizar la tecnología Reflection para cargar el ensamblado en la memoria (es decir, sin la necesidad de crear un archivo local) y ejecutar el punto de entrada o invocación (entry point) del programa:

Código (vbnet) [Seleccionar]
#Region " Imports "

Imports System.Reflection
Imports System.Security
Imports System.Security.Permissions

#End Region

#Region " Resource Util "

Namespace ElektroKit.Core.Application.Resources.Tools

   Partial Public NotInheritable Class ResourceUtil

#Region " Public Methods "

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Loads a resource in memory and executes its main entrypoint.
       ''' <para></para>
       ''' The resource must be a .NET assembly.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <example> This is a code example.
       ''' <code>
       ''' Execute(My.Resources.MyProgram)
       ''' </code>
       ''' </example>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <param name="resource">
       ''' The resource to execute.
       ''' </param>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <exception cref="EntryPointNotFoundException">
       ''' Entrypoint not found in the specified resource. Are you sure it is a .NET assembly?
       ''' </exception>
       ''' ----------------------------------------------------------------------------------------------------
       <DebuggerStepThrough>
       Public Shared Sub Execute(ByVal resource As Byte())
           ResourceUtil.Execute(resource, Nothing)
       End Sub

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Loads a resource in memory and executes its main entrypoint.
       ''' <para></para>
       ''' The resource must be a .NET assembly.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <example> This is a code example.
       ''' <code>
       ''' Execute(My.Resources.MyProgram, {"Parameter 1", "Parameter 2", "etc..."})
       ''' </code>
       ''' </example>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <param name="resource">
       ''' The resource to execute.
       ''' </param>
       '''
       ''' <param name="parameters">
       ''' The parameters to pass to the method executed.
       ''' </param>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <exception cref="EntryPointNotFoundException">
       ''' Entrypoint not found in the specified resource. Are you sure it is a .NET assembly?
       ''' </exception>
       ''' ----------------------------------------------------------------------------------------------------
       <DebuggerStepThrough>
       Public Shared Sub Execute(ByVal resource As Byte(), ByVal parameters As Object())
           Dim helper As New ExecuteHelper()
           helper.LoadAssembly(resource, parameters)
       End Sub

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Loads a resource in memory and executes its main entrypoint.
       ''' <para></para>
       ''' The resource must be a .NET assembly.
       ''' <para></para>
       ''' If the loaded assembly attempts to force an application termination
       ''' by for example internaly calling <see cref="Environment.Exit"/>, then the call is catched and ignored.
       ''' <para></para>
       ''' The downside is that the loaded assembly will not be able to call (P/Invoke) unmanaged code. You are advised.
       ''' <para></para>
       ''' *** Note that this is a experimental methodology. ***
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <example> This is a code example.
       ''' <code>
       ''' ExecuteSafe(My.Resources.MyProgram)
       ''' </code>
       ''' </example>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <param name="resource">
       ''' The resource to execute.
       ''' </param>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <exception cref="EntryPointNotFoundException">
       ''' Entrypoint not found in the specified resource. Are you sure it is a .NET assembly?
       ''' </exception>
       ''' ----------------------------------------------------------------------------------------------------
       <DebuggerStepThrough>
       Public Shared Sub ExecuteSafe(ByVal resource As Byte())
           ResourceUtil.ExecuteSafe(resource, Nothing)
       End Sub

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Loads a resource in memory and executes its main entry point.
       ''' <para></para>
       ''' The resource must be a .NET assembly.
       ''' <para></para>
       ''' If the loaded assembly attempts to force an application termination
       ''' by for example internaly calling <see cref="Environment.Exit"/>, then the call is catched and ignored.
       ''' <para></para>
       ''' The downside is that the loaded assembly will not be able to call (P/Invoke) unmanaged code. You are advised.
       ''' <para></para>
       ''' *** Note that this is a experimental methodology. ***
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <example> This is a code example.
       ''' <code>
       ''' ExecuteSafe(My.Resources.MyProgram, {"Parameter 1", "Parameter 2", "etc..."})
       ''' </code>
       ''' </example>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <param name="resource">
       ''' The resource to execute.
       ''' </param>
       '''
       ''' <param name="parameters">
       ''' The parameters to pass to the method executed.
       ''' </param>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <exception cref="EntryPointNotFoundException">
       ''' Entrypoint not found in the specified resource. Are you sure it is a .NET assembly?
       ''' </exception>
       ''' ----------------------------------------------------------------------------------------------------
       <DebuggerStepThrough>
       Public Shared Sub ExecuteSafe(ByVal resource As Byte(), ByVal parameters As Object())

           ' This is where the main executable resides. For more info on this, see the "Remarks" section at:
           ' http://msdn.microsoft.com/en-us/library/system.appdomainsetup.applicationbase(v=vs.110).aspx#Anchor_1
           Dim adSetup As New AppDomainSetup()
           adSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory

           ' Permissions of the AppDomain/what it can do.
           Dim permission As New PermissionSet(PermissionState.None)
           With permission
               ' All SecurityPermission flags EXCEPT UnmanagedCode, which is required by Environment.Exit() method.
               .AddPermission(New SecurityPermission(SecurityPermissionFlag.AllFlags And Not SecurityPermissionFlag.UnmanagedCode))
               .AddPermission(New EnvironmentPermission(PermissionState.Unrestricted))
               .AddPermission(New EventLogPermission(PermissionState.Unrestricted))
               .AddPermission(New FileDialogPermission(PermissionState.Unrestricted))
               .AddPermission(New FileIOPermission(PermissionState.Unrestricted))
               .AddPermission(New GacIdentityPermission(PermissionState.Unrestricted))
               .AddPermission(New IsolatedStorageFilePermission(PermissionState.Unrestricted))
               .AddPermission(New KeyContainerPermission(PermissionState.Unrestricted))
               .AddPermission(New PerformanceCounterPermission(PermissionState.Unrestricted))
               .AddPermission(New PrincipalPermission(PermissionState.Unrestricted))
               .AddPermission(New ReflectionPermission(PermissionState.Unrestricted))
               .AddPermission(New RegistryPermission(PermissionState.Unrestricted))
               .AddPermission(New SiteIdentityPermission(PermissionState.Unrestricted))
               .AddPermission(New StorePermission(PermissionState.Unrestricted))
               .AddPermission(New TypeDescriptorPermission(PermissionState.Unrestricted))
               .AddPermission(New UIPermission(PermissionState.Unrestricted))
               .AddPermission(New UrlIdentityPermission(PermissionState.Unrestricted))
               .AddPermission(New ZoneIdentityPermission(PermissionState.Unrestricted))
           End With

           ' Our sandboxed AppDomain.
           Dim domain As AppDomain = AppDomain.CreateDomain("SomeGenericName", Nothing, adSetup, permission, Nothing)

           Try
               ' Create an instance of Helper in the sandboxed AppDomain.
               Dim helper As ExecuteHelper = DirectCast(domain.CreateInstanceAndUnwrap(GetType(ExecuteHelper).Assembly.FullName, GetType(ExecuteHelper).FullName), ExecuteHelper)
               helper.LoadAssembly(resource, parameters)

           Catch ex As TargetInvocationException When (ex.InnerException.GetType() = GetType(SecurityException))
               ' Some kind of permissions issue occured here, possibly an attempt to call Environment.Exit() or call (P/Invoke) unmanaged code.
               ' Do Nothing.

           Catch ex As Exception
               Throw

           End Try

       End Sub

#End Region

   End Class

   ''' ----------------------------------------------------------------------------------------------------
   ''' <summary>
   ''' A class that serves to execute assemblies that are stored as application resource (eg. My.Resources.MyProgram1 )
   ''' </summary>
   ''' ----------------------------------------------------------------------------------------------------
   Friend NotInheritable Class ExecuteHelper : Inherits MarshalByRefObject

       ''' ----------------------------------------------------------------------------------------------------
       ''' <summary>
       ''' Loads the assembly.
       ''' </summary>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <param name="bytes">
       ''' The bytes of the assembly/resource to execute.
       ''' </param>
       '''
       ''' <param name="parameters">
       ''' The parameters to pass to the method executed.
       ''' </param>
       ''' ----------------------------------------------------------------------------------------------------
       ''' <exception cref="EntryPointNotFoundException">
       ''' Entrypoint not found in the specified resource. Are you sure it is a .NET assembly?
       ''' </exception>
       ''' ----------------------------------------------------------------------------------------------------
       Public Sub LoadAssembly(ByVal bytes As Byte(), ByVal parameters As Object())
           Dim ass As Assembly = Assembly.Load(bytes)
           Dim method As MethodInfo = ass.EntryPoint

           If (method IsNot Nothing) Then
               Dim instance As Object = ass.CreateInstance(method.Name)
               method.Invoke(instance, parameters)
               If (instance IsNot Nothing) AndAlso (instance.GetType().GetInterfaces.Contains(GetType(IDisposable))) Then
                   DirectCast(instance, IDisposable).Dispose()
               End If
               instance = Nothing
               method = Nothing
               ass = Nothing

           Else
               Throw New EntryPointNotFoundException("Entrypoint not found in the specified resource. Are you sure it is a .NET assembly?")

           End If
       End Sub

   End Class

End Namespace

#End Region


Modo de empleo:
Código (vbnet) [Seleccionar]
ResourceUtil.Execute(My.Resources.Program1, parameters:=Nothing)
o bien:
Código (vbnet) [Seleccionar]
ResourceUtil.ExecuteSafe(My.Resources.Program1, parameters:=Nothing)








**Aincrad**

#6
si , pero si por lo menos quiero guardar ese bat con codificación ANSI .
seria algo como esto?

Código (vbnet) [Seleccionar]
Dim ruta As String = dirPath & "usb.bat"
           Dim escritor As StreamWriter
           escritor = (File.AppendText(ruta, True, System.Text.ASCIIEncoding.ASCII.GetEncoding))
           escritor.Write(TextBox1.Text)
           escritor.Flush()
           escritor.Close()


aun así me marca error. no logro guardarlo en ansi.  :-(

tampoco lo logro con :  Encoding.GetEncoding(1252) creo que lo estoy escribiendo mal-




Eleкtro

#7
Cita de: **Aincrad** en 11 Octubre 2017, 04:40 AM
si , pero si por lo menos quiero guardar ese bat con codificación ANSI .
seria algo como esto?

Código (vbnet) [Seleccionar]
Dim ruta As String = dirPath & "usb.bat"
           Dim escritor As StreamWriter
           escritor = (File.AppendText(ruta, True, System.Text.ASCIIEncoding.ASCII.GetEncoding))
           escritor.Write(TextBox1.Text)
           escritor.Flush()
           escritor.Close()


aun así me marca error. no logro guardarlo en ansi.  :-(

tampoco lo logro con :  Encoding.GetEncoding(1252) creo que lo estoy escribiendo mal-

Ese código te tiene que dar varios errores de sintaxis ya que la función File.AppendText() solo acepta 1 argumento, y además la descripción de la función especifica de forma muy clara y concisa que el texto adjuntado en el archivo será en codificación UTF-8 (o dicho de otra forma, la función devolverá una instancia de la clase StreamWriter que escribirá el output en codificación UTF-8). ¿por qué no lo lees?, pasa el puntero del ratón por encima del nombre de la función, y lee la descripción...

Lo repito de nuevo a modo de consejo: mírate las sobrecargas del constructor de la clase StreamWriter, verás que hay un parámetro para poder especificar la codificación de texto...

De todas formas me da la sensación de que estás mezclando cosas intentando hacer más pasos de los que realmente son necesarios para lograr el objetivo de escribir un archivo de texto/bat, te debería ser suficiente con reemplazar todo ese código que tienes y en su lugar utilizar el método File.AppendAllText() de la siguiente manera:
Código (vbnet) [Seleccionar]
File.AppendAllText("C:\Archivo.bat", "contenido del bat", Encoding.Default)

Nota: la propiedad Encoding.Default devuelve la codificación de texto ANSI actual que tengas activada en tu sistema operativo, es decir, Windows-1252, pero si lo prefieres puedes especificar de forma manual el código de páginas ANSI (o el nombre) exacto:
Código (vbnet) [Seleccionar]
File.AppendAllText("C:\Archivo.bat", "contenido del bat", Encoding.GetEncoding(1252))

Si realmente necesitases utilizar la clase StreamWriter, te muestro un ejemplo de como lo puedes hacer:
Código (vbnet) [Seleccionar]
Using sw As New StreamWriter("C:\Archivo.bat", append:=False, encoding:=Encoding.Default, bufferSize:=8192)
   sw.AutoFlush = True
   sw.Write("Contenido del bat")
End Using

( "Contenido del bat" = TextBox1.Text )

Saludos.








**Aincrad**

Gracias Elektro me has ayudado una vez mas.  ;-)  ;-)  ;-)

PD: acerca de las sobrecargas , voy a verificar eso Muchas Gracias.  ;-)