如何将资源添加到AutoIt

如何将资源添加到AutoIt

本文介绍了如何将资源添加到AutoIt exe文件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在AutoIT应用程序中包含一些txt文件.

I want to include a few txt files to my AutoIT application.

#AutoIt3Wrapper_Res_Field=#AutoIt3Wrapper_icon|C:\Scripts\AutoIt\HelpDeskIT\images\helpdesk_icon.ico
#AutoIt3Wrapper_Res_File_Add=C:\Scripts\AutoIt\HelpDeskIT\Instructions.txt
#AutoIt3Wrapper_Res_File_Add=C:\Scripts\AutoIt\HelpDeskIT\reportaproblem.txt

,但未将其添加到我的exe文件中. (当我启动该应用程序时,它找不到文件)

but it's not being added to my exe file. (when I launch the app it can't find the files)

推荐答案

从SciTE4AutoIt3帮助(在Extra Utilities下-> AutoIt3Wrapper)...

From the SciTE4AutoIt3 help (under Extra Utilities --> AutoIt3Wrapper)...

文件存储在RT_RCDATA节中,通常以字节存储 为字节.如果部分值设置为-10(RT_RCDATA在内部 评估为10),然后在添加文件之前先对其进行压缩:

Files are stored in the RT_RCDATA section and are usually stored byte for byte. If the section value is set to -10 (RT_RCDATA is internally evaluated as 10) then the file is compressed before being added:

#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指令:

When the file is required it can be extracted using this code. Set the $isCompressed parameter to match the Res_File_Add directive:

#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[" & $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

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[" & $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

这篇关于如何将资源添加到AutoIt exe文件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-18 12:35