#autoit
#autoit
Вопрос:
Я хочу включить несколько текстовых файлов в мое приложение AutoIt.
#AutoIt3Wrapper_Res_Field=#AutoIt3Wrapper_icon|C:ScriptsAutoItHelpDeskITimageshelpdesk_icon.ico
#AutoIt3Wrapper_Res_File_Add=C:ScriptsAutoItHelpDeskITInstructions.txt
#AutoIt3Wrapper_Res_File_Add=C:ScriptsAutoItHelpDeskITreportaproblem.txt
но он не добавляется в мой exe-файл. (когда я запускаю приложение, оно не может найти файлы)
Ответ №1:
Из справки SciTE4AutoIt3 (в разделе Дополнительные утилиты -> AutoIt3Wrapper)…
Добавление файла:
Файлы хранятся в разделе RT_RCDATA и обычно хранятся байт за байтом. Если для значения раздела установлено значение -10 (RT_RCDATA внутренне оценивается как 10), то файл сжимается перед добавлением:
#AutoIt3Wrapper_Res_File_Add=file_name, RT_RCDATA : UNCOMPRESSED #AutoIt3Wrapper_Res_File_Add=file_name, 10 ; UNCOMPRESSED #AutoIt3Wrapper_Res_File_Add=file_name, -10 ; COMPRESSED
Когда файл требуется, его можно извлечь с помощью этого кода. Установите параметр
$isCompressed в соответствии с директивой Res_File_Add:#include <WinAPIRes.au3> #include <WinAPIInternals.au3> Func _FileInstallFromResource($sResName, $sDest, $isCompressed = False, $iUncompressedSize = Default) Local $bBytes = _GetResourceAsBytes($sResName, $isCompressed, $iUncompressedSize) If @error Then Return SetError(@error, 0, 0) FileDelete($sDest) FileWrite($sDest, $bBytes) EndFunc Func _GetResourceAsBytes($sResName, $isCompressed = False, $iUncompressedSize = Default) Local $hMod = _WinAPI_GetModuleHandle(Null) 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[" amp; $dSize amp; "]") _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 Func _WinAPI_LZNTDecompress(ByRef $tInput, ByRef $tOutput, $iUncompressedSize = Default) ; if no uncompressed size given, use 16x the input buffer If $iUncompressedSize = Default Then $iUncompressedSize = 16 * DllStructGetSize($tInput) Local $tBuffer, $ret $tOutput = 0 $tBuffer = DllStructCreate("byte[" amp; $iUncompressedSize amp; "]") 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[" amp; $ret[6] amp; "]") If Not _WinAPI_MoveMemory(DllStructGetPtr($tOutput), DllStructGetPtr($tBuffer), $ret[6]) Then $tOutput = 0 Return SetError(4, 0, 0) EndIf Return $ret[6] EndFunc