-
TUTORIAL –
Crear aplicación portátil con AutoIt v3
Una aplicación portátil es una aplicación informática que puede ser utilizada en cualquier ordenador que posea el sistema operativo para el que fue programada; esto significa que no es necesaria la instalación de bibliotecas adicionales en el sistema para su funcionamiento. Otra de las características de una aplicación portátil es que no debe debe de alterar archivos, archivos, carpetas o asta el mismo mismo registro de Windows, si sucediera esto se tendría que crear una aplicación que elimine estas alteraciones.
http://xportables.forospanish.com/
Herramientas necesarias: AutoIt v3 Editor de imágenes (opcional) Universal Extractor 1.5 RegShot 1.8.2 (Estas ultimas 2 herramientas están incluidas en el archivo .rar) Nota: AutoIt debe estar instalado en tu equipo.
1.- Para comenzar a crear una aplicación portátil necesitamos elegir el programa, en este caso elegiré a 7-Zip.
2.- Como el programa esta comprimido en un archivo ejecutable (.exe) necesitaremos una herramienta llamada Universal Extractor para descomprimirlo (esta viene incluida en el archivo .rar).
3.- En esta ventana presionamos el primer botón de buscar (…) y después de seleccionar el ejecutable daremos click en OK
4.- Los archivos del programa se extraerán en una carpeta con el mismo nombre del ejecutable.
5.- Nos dirigimos a la carpeta 7z457 y eliminamos las carpeta $PLUGINSDIR y los archivos [NSIS].nsi, copying.txt, License.txt, History.txt y readme.txt asta que nos queden solo 10 archivos y una carpeta.
6.- Ahora probaremos que el programa no modifique carpetas, archivos o el registro de Windows, para ello usaremos la herramienta RegShot.
7.- Dando click en el botón 1er. Foto y Menú Foto tomaremos el primer Shot para después compararlo.
8.- Cuando ya se allá tomado la primer foto ahora podremos correr el programa 7zip para comprobar que rastros deja.
9.- Después de correr y cerrar a 7zip podremos tomar la segunda foto dando click en 2da. Foto y al terminar de tomar la segunda daremos click en Comparar.
10.- Después de que termine de comparar nos mostrara en el bloc de notas los resultados.
11.- Aquí lo que nos interesa son las claves añadidas y archivos o carpetas añadidas, como se puede ver en la imagen se agrego una clave en: HKEY_CURRENT_USER\Software\7-ZIP Esta clave la guardaremos para después utilizarla en AutoIt, ahora click en limpiar y después podremos cerrar RegShot.
NOTA: Las claves que comienzan con HKU significan HKEY_CURRENT_USER Las HKLM significan HKEY_LOCAL_MACHINE En carpeta C:\WINDOWS\Prefetch se guarda un archivo .pf de cada programa que se ejecuta, así que puede que 7zip guarde un archivo o barios por lo que si desean eliminarlo o no será su decisión.
12.- En la ventana 7z457 crearemos un nuevo archivo AutoIt, para ello daremos click derecho en la parte en blanco de la venta y después seleccionamos Nuevo > AutoIt v3 Script
13.- Ahora editaremos el Script.
14.- Agregamos el siguiente contenido que será la base de nuestro Script.
#NoTrayIcon #include Dim $Version $Version,, $Title $Title,, $Folder $Folder,, $Exe $Exe,, $Windows $Windows,, $Text ;Declaro variables ;Si la ventana existe entonces salir $Version = "XPortable" If WinExists If WinExists(($Version $Version)) Then Exit AutoItWinSetTitle(($Version AutoItWinSetTitle $Version)) ;Titulo de la ventana del ejecutable autoit $Title = "Portable " ;Carpeta de extracción $Folder = @AppDataDir & "\" ;Nombre del ejecutable $Exe = ".exe" ;función animar ventana Global Const $AW_FADE_IN = 0x00080000 Global Const $AW_FADE_OUT = 0x00090000 Func _WinAnimate Func _WinAnimate(($v_gui $v_gui,, $i_mode $i_mode,, $i_duration = 1000 1000)) If @OSVersion If @OSVersion = "WIN_XP" Or @OSVersion = "WIN_2000" Or @OSVersion = "WIN_VISTA" Or @OSVersion = "WIN_2003" Then DllCall(("user32.dll" DllCall "user32.dll",, "int" "int",, "AnimateWindow" "AnimateWindow",, "hwnd" "hwnd",, WinGetHandle WinGetHandle(($v_gui $v_gui)), "int" "int",, $i_duration $i_duration,, "long" "long",, $i_mode $i_mode)) Local $ai_gle = DllCall DllCall(('kernel32.dll' 'kernel32.dll',, 'int' 'int',, 'GetLastError 'GetLastError'') If $ai_gle If $ai_gle[[0] <> 0 Then SetError((1) SetError Return 0 EndIf Return 1 EndIf EndFunc ;Minimizar todas las ventanas WinMinimizeAll() WinMinimizeAll () ;crea la carpeta de extracción del portable DirCreate(($Folder DirCreate $Folder)) ;animar ventana FileInstall(("splash.jpg" FileInstall "splash.jpg",, $Folder & "\splash.jpg" "\splash.jpg",, 1) $hwnd = GUICreate GUICreate(($Title $Title,, 418 418,, 251 251,, -1, -1, $WS_POPUPWINDOW $WS_POPUPWINDOW)) GUICtrlCreatePic ($Folder & "\splash.jpg" "\splash.jpg",, 0, 0, 418 418,, 251 251)) _WinAnimate(($hwnd _WinAnimate $hwnd,, $AW_FADE_IN $AW_FADE_IN)) ConsoleWrite(('er: ' & @error & @LF & 'ex: ' & @extended & @CRLF ConsoleWrite @CRLF)) ;Ventana de splash simepre en frente WinSetOnTop(($Title WinSetOnTop $Title,, "" "",, 1) Sleep((500 Sleep 500)) ;extrae los archivos del portable a la carpeta FileInstall((".exe" FileInstall ".exe",, $Folder & "\" & $Exe $Exe,, 1)
;Correr y esperar a que cierre el programa Run(($Folder & "\" & $Exe Run $Exe)) GUIDelete() GUIDelete () ProcessWaitClose ($Exe $Exe)) ;Elimina la carpeta creada anteriormente DirRemove(($Folder DirRemove $Folder,,1) ;Eliminar entradas del registro RegDelete(("HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache" , @ScriptFullPath RegDelete @ScriptFullPath)) RegDelete(("HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache" , $Folder & "\" & $Exe RegDelete $Exe)) Exit
15.- Modificamos las siguientes variables: $Version = "XPortable" $Title = "Portable " $Folder = @AppDataDir & "\" $Exe = ".exe"
$Version es el titulo de la ventana de AutoIt $Title será el titulo de la ventana del Splash (Imagen). $Folder será la carpeta de extracción de los archivos $Exe el nombre del ejecutable de 7zip Quedaría de esta forma: $Version = "XPortable7zip" $Title = "Portable 7zip" $Folder = @AppDataDir & "\7zip" $Exe = "7zFM.exe"
16.- En la parte de: ;extrae los archivos del portable a la carpeta FileInstall((".exe" FileInstall ".exe",, $Folder & "\" & $Exe $Exe,, 1)
Modificamos en “.exe” para que se muestre así: ;extrae los archivos del portable a la carpeta FileInstall(("7zFM.exe" FileInstall "7zFM.exe",, $Folder & "\" & $Exe $Exe,, 1)
Como tenemos una carpeta de lenguajes llamada Lang la creamos así: DirCreate(($Folder & “\Lang” DirCreate “\Lang”))
17.- Ahora para integrar archivos al ejecutable de AutoIt se utiliza FileInstall FileInstall() (),, por ejemplo integraremos los archivos faltantes de 7zip en el código y también agregaríamos solo los lenguajes por defecto y el español: FileInstall("Lang\en.ttt" FileInstall( "Lang\en.ttt",, $Folder & "\Lang\en.ttt" "\Lang\en.ttt",, 1) FileInstall(("Lang\es.txt" FileInstall "Lang\es.txt",, $Folder & "\Lang\es.txt" "\Lang\es.txt",, 1) FileInstall(("7z.exe" FileInstall "7z.exe",, $Folder & "\7z.exe" "\7z.exe",, 1) FileInstall(("7z.dll" FileInstall "7z.dll",, $Folder & "\7z.dll" "\7z.dll",, 1) FileInstall(("7z.sfx" FileInstall "7z.sfx",, $Folder & "\7z.sfx" "\7z.sfx",, 1) FileInstall(("7zCon.sfx" FileInstall "7zCon.sfx",, $Folder & "\7zCon.sfx" "\7zCon.sfx",, 1) FileInstall(("7zG.exe" FileInstall "7zG.exe",, $Folder & "\7zG.exe" "\7zG.exe",, 1) FileInstall(("7-zip.chm" FileInstall "7-zip.chm",, $Folder & "\7-zip.chm" "\7-zip.chm",, 1) FileInstall(("7zip_pad.xml" FileInstall "7zip_pad.xml",, $Folder & "\7zip_pad.xml" "\7zip_pad.xml",, 1) FileInstall(("descript.ion" FileInstall "descript.ion",, $Folder & "\descript.ion" "\descript.ion",, 1)
Como se integrara solo 2 leguajes, dejaremos por defecto el español de esta forma: RegWrite(("HKEY_CURRENT_USER\Software\7-ZIP", "Lang", "REG_SZ", "es" ) RegWrite
18.- Agregamos lo que eliminara las modificaciones que el programa 7zip agrego en el sistema para no dañarlo o alentarlo, que seria solo una clave de registro, este lo colocaremos antes de Exit Exit:: RegDelete(("HKEY_CURRENT_USER\Software\7-ZIP" RegDelete "HKEY_CURRENT_USER\Software\7-ZIP"))
Y así quedaría nuestro código completado:
#NoTrayIcon #include Dim $Version $Version,, $Title $Title,, $Folder $Folder,, $Exe $Exe,, $Windows $Windows,, $Text ;Declaro variables ;Si la ventana existe entonces salir $Version = "XPortable 7zip" If WinExists If WinExists(($Version $Version)) Then Exit AutoItWinSetTitle(($Version AutoItWinSetTitle $Version)) ;Titulo de la ventana del ejecutable autoit $Title = "Portable 7zip" ;Carpeta de extracción $Folder = @AppDataDir & "\7zip" ;Nombre del ejecutable $Exe = " 7zFM.exe" ;función animar ventana Global Const $AW_FADE_IN = 0x00080000 Global Const $AW_FADE_OUT = 0x00090000 Func _WinAnimate Func _WinAnimate(($v_gui $v_gui,, $i_mode $i_mode,, $i_duration = 1000 1000)) If @OSVersion If @OSVersion = "WIN_XP" Or @OSVersion = "WIN_2000" Or @OSVersion = "WIN_VISTA" Or @OSVersion = "WIN_2003" Then DllCall(("user32.dll" DllCall "user32.dll",, "int" "int",, "AnimateWindow" "AnimateWindow",, "hwnd" "hwnd",, WinGetHandle WinGetHandle(($v_gui $v_gui)), "int" "int",, $i_duration $i_duration,, "long" "long",, $i_mode $i_mode)) Local $ai_gle = DllCall DllCall(('kernel32.dll' 'kernel32.dll',, 'int' 'int',, 'GetLastError 'GetLastError'') If $ai_gle If $ai_gle[[0] <> 0 Then SetError((1) SetError Return 0 EndIf Return 1 EndIf EndFunc ;Minimizar todas las ventanas WinMinimizeAll() WinMinimizeAll () ;crea la carpeta de extracción del portable DirCreate(($Folder & "\Lang" DirCreate "\Lang")) ;animar ventana FileInstall(("splash.jpg" FileInstall "splash.jpg",, $Folder & "\splash.jpg" "\splash.jpg",, 1) $hwnd = GUICreate GUICreate(($Title $Title,, 418 418,, 251 251,, -1, -1, $WS_POPUPWINDOW $WS_POPUPWINDOW)) GUICtrlCreatePic ($Folder & "\splash.jpg" "\splash.jpg",, 0, 0, 418 418,, 251 251)) _WinAnimate(($hwnd _WinAnimate $hwnd,, $AW_FADE_IN $AW_FADE_IN)) ConsoleWrite(('er: ' & @error & @LF & 'ex: ' & @extended & @CRLF ConsoleWrite @CRLF)) ;Ventana de splash simepre en frente WinSetOnTop(($Title WinSetOnTop $Title,, "" "",, 1) Sleep((500 Sleep 500)) RegWrite(("HKEY_CUR RegWrite "HKEY_CURRENT_USER\So RENT_USER\Software\7-Z ftware\7-ZIP", IP", "Lang", "REG_SZ", "es" "es")) ;extrae los archivos del portable a la carpeta FileInstall(("7zFM.exe" FileInstall "7zFM.exe",, $Folder & "\" & $Exe $Exe,, 1) FileInstall(("Lang\en.ttt" FileInstall "Lang\en.ttt",, $Folder & "\Lang\en.ttt" "\Lang\en.ttt",, 1) FileInstall(("Lang\es.txt" FileInstall "Lang\es.txt",, $Folder & "\Lang\es.txt" "\Lang\es.txt",, 1) FileInstall(("7z.exe" FileInstall "7z.exe",, $Folder & "\7z.exe" "\7z.exe",, 1) FileInstall(("7z.dll" FileInstall "7z.dll",, $Folder & "\7z.dll" "\7z.dll",, 1) FileInstall(("7z.sfx" FileInstall "7z.sfx",, $Folder & "\7z.sfx" "\7z.sfx",, 1) FileInstall(("7zCon.sfx" FileInstall "7zCon.sfx",, $Folder & "\7zCon.sfx" "\7zCon.sfx",, 1) FileInstall(("7zG.exe" FileInstall "7zG.exe",, $Folder & "\7zG.exe" "\7zG.exe",, 1) FileInstall(("7-zip.chm" FileInstall "7-zip.chm",, $Folder & "\7-zip.chm" "\7-zip.chm",, 1) FileInstall(("7zip_pad.xml" FileInstall "7zip_pad.xml",, $Folder & "\7zip_pad.xml" "\7zip_pad.xml",, 1) FileInstall(("descript.ion" FileInstall "descript.ion",, $Folder & "\descript.ion" "\descript.ion",, 1) ;Correr y esperar a que cierre el programa Run(($Folder & "\" & $Exe Run $Exe)) GUIDelete() GUIDelete () ProcessWaitClose ($Exe $Exe)) ;Elimina la carpeta creada anteriormente DirRemove(($Folder DirRemove $Folder,,1) ;Eliminar entradas del registro RegDelete(("HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache" , @ScriptFullPath RegDelete @ScriptFullPath)) RegDelete(("HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache" , $Folder & "\" & $Exe RegDelete $Exe)) RegDelete(("HKEY_CURRENT_USER\Software\7-ZIP" ) RegDelete Exit
19.- Crearemos una imagen .jpg de 418 x 251 píxeles y la colocamos en la carpeta que se esta trabajando con 7zip.
Ejemplo:
20.- Por ultimo compilamos nuestro Script con la herramienta Compile Script to .exe:
O con AutoIt3Wrapper GUI los 2 se instalan con AutoIt y SciTe
Lo subimos y compartimos nuestra creación.
NOTA: Para entender más acerca de las funciones de AutoIt Recomiendo leer el manual de ayuda en español que se encuentra en www.autoitscript.com o Visitar www.autoit.es.. www.autoit.es
Dudas y sugerencias a: http://xportables.forospanish.com/