Что нового

[Compiled] Инсталятор программы на базе AutoIT

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
AutoIt: 3.3.12.0


Категория: Вспомогательные функции

Описание: Это не проект, скорее всего, размышления на тему.
Если программа небольшая, то можно использовать инструменты AutoIT для создания своего инсталятора своей программы. Использовал примеры из справки SciTE4AutoIt3 (Adding data to the program resources ). Файл kit это конструктор. Выбираем папку с файлами. Файл code это основная часть программы для распаковки файлов.
Запускаем kit, указываем папку. Создается файл install.au3. Компилируем его Compile with Options, то есть через AutoIt3Wrapper.
Запускаем программу, указываем папку для распаковки.
Я ни в коем случае не хочу сравнивать данный метод с работой известных инсталяторов софта.
Экспериментировал с файлами общим объемом 2,9 МБ. после комплияции получился файл размером в два раза меньше. естественно не все файлы хорошо сжимаются. да и время добавления файлов не очень маленькое. на упаковку таким образом указанного объема файлов у меня ушло 10 секунд.


kit:
Код:
#include <FileOperations.au3>
$fsf = FileSelectFolder('', '')
If @error Then Exit
$filear = _FO_FileSearch($fsf)
If @error Then Exit
$fo = FileOpen('install.au3', 1)
FileWriteLine($fo, '#include <WinAPI.au3>')
FileWriteLine($fo, '#include <WinAPIRes.au3>')
FileWriteLine($fo, '#AutoIt3Wrapper_Compression=4')
FileWriteLine($fo, '#AutoIt3Wrapper_UseUpx=y')
For $i = 1 To $filear[0]
    FileWriteLine($fo, '#AutoIt3Wrapper_Res_File_Add=' & FileGetShortName($filear[$i]) & ', -10')
Next
FileWriteLine($fo, 'Global $array[' & UBound($filear) & ']')
For $i = 1 To $filear[0]
    FileWriteLine($fo, '$array[' & $i & ']=' & "'" & StringReplace($filear[$i], $fsf, '') & "'")
Next
$fr = FileRead('code.au3')
FileWrite($fo, $fr)
FileClose($fo)

code:
Код:
$path = FileSelectFolder('', '')
If @error Then Exit

Local $hModRes = _WinAPI_GetModuleHandle(0)

For $i = 1 To UBound($array) - 1
	_FileInstallFromResource($hModRes, $i, $path & $array[$i], True)
Next

Func _FileInstallFromResource($hMod, $sResName, $sDest, $isCompressed = False, $iUncompressedSize = Default)
	Local $bBytes = _GetResourceAsBytes($hMod, $sResName, $isCompressed, $iUncompressedSize)
	If @error Then
		FileWriteLine('log.txt', @error)
		Return SetError(@error, 0, 0)
	EndIf
	Local $hFile = FileOpen($sDest, 26)
	FileWrite($hFile, $bBytes)
	FileClose($hFile)
EndFunc   ;==>_FileInstallFromResource

Func _GetResourceAsBytes($hMod, $sResName, $isCompressed = False, $iUncompressedSize = Default)
	Local $hRes = _WinAPI_FindResource($hMod, 10, $sResName)
	If @error Or Not $hRes Then Return SetError(1, 0, 0)
	Local $dSize = _WinAPI_SizeOfResource($hMod, $hRes)
	If @error Or Not $dSize Then Return SetError(2, 0, 0)
	Local $hLoad = _WinAPI_LoadResource($hMod, $hRes)
	If @error Or Not $hLoad Then Return SetError(3, 0, 0)
	Local $pData = _WinAPI_LockResource($hLoad)
	If @error Or Not $pData Then Return SetError(4, 0, 0)
	Local $tBuffer = DllStructCreate("byte[" & $dSize & "]")
	_WinAPI_MoveMemory(DllStructGetPtr($tBuffer), $pData, $dSize)
	If $isCompressed Then
		Local $oBuffer
		_WinAPI_LZNTDecompress($tBuffer, $oBuffer, $iUncompressedSize)
		If @error Then Return SetError(5, 0, 0)
		$tBuffer = $oBuffer
	EndIf
	Return DllStructGetData($tBuffer, 1)
EndFunc   ;==>_GetResourceAsBytes

Func _WinAPI_LZNTDecompress(ByRef $tInput, ByRef $tOutput, $iUncompressedSize = Default)
	If $iUncompressedSize = Default Then $iUncompressedSize = 16 * DllStructGetSize($tInput)
	Local $tBuffer, $ret
	$tOutput = 0
	$tBuffer = DllStructCreate("byte[" & $iUncompressedSize & "]")
	If @error Then Return SetError(1, 0, 0)
	$ret = DllCall("ntdll.dll", "long", "RtlDecompressBuffer", "ushort", 2, "struct*", $tBuffer, "ulong", $iUncompressedSize, "struct*", $tInput, "ulong", DllStructGetSize($tInput), "ulong*", 0)
	If @error Then Return SetError(2, 0, 0)
	If $ret[0] Then Return SetError(3, $ret[0], 0)
	$tOutput = DllStructCreate("byte[" & $ret[6] & "]")
	If Not _WinAPI_MoveMemory(DllStructGetPtr($tOutput), DllStructGetPtr($tBuffer), $ret[6]) Then
		$tOutput = 0
		Return SetError(4, 0, 0)
	EndIf
	Return $ret[6]
EndFunc   ;==>_WinAPI_LZNTDecompress

Это не программа - инсталятор, а примеры возможной сборки инсталятора

Источник: autoit-script.ru
Автор(ы): Справка по AutoIT :smile:
 
Верх