一个替换编译后资源文件的参考示例

#NoEnv
SetBatchLines -1
SetWorkingDir %A_ScriptDir%

FileSelectFile, AHK解释器路径, , %A_ScriptDir%,选择要替换脚本内容的编译,*.exe
if (AHK解释器路径="")
  ExitApp
; AHK解释器路径 := A_ScriptFullPath   ; 解掉这行就是替换自身代码并更新运行

FileCopy, %AHK解释器路径%, %A_ScriptDir%\替换原脚本内容.exe, 1 ; 覆盖
if ErrorLevel
  Return

根目录路径生成exe := A_ScriptDir "\替换原脚本内容.exe"

; FileRead, hModule, *c %根目录路径生成exe%

hModule := DllCall("LoadLibraryEx", "Str", 根目录路径生成exe, "Ptr", 0, "Int", 0x02, "Ptr")  ; 一旦不需要,用FreeLibrary函数释放DLL

file := A_ScriptDir "\新脚本内容.ahk"
if !FileExist(file) {
  MsgBox 新脚本内容 不存在
  ExitApp
}

FileGetSize, filesize, %file%
; VarSetCapacity(filedata, filesize)
FileRead, filedata, *c %file%

; fxx := FileOpen(file, "r", "UTF-8-RAW")
; fxx.RawWrite(filedata, filesize)
; fxx := ""

; MsgBox % filesize

hUpdate := DllCall("BeginUpdateResource", "str", 根目录路径生成exe, "uint", 0, "ptr")

; 对指定名称路径,写入资源文件【比如脚本内容】
DllCall("UpdateResource", "ptr", hUpdate, "ptr", 10, "str", ">AUTOHOTKEY SCRIPT<", "ushort", 0x409, "ptr", &filedata, "uint", filesize, "uint")

; 清除指定名称资源文件
; DllCall("UpdateResource", "ptr", hUpdate, "ptr", 10, "str", ">AUTOHOTKEY SCRIPT<", "ushort", 0x409, "Ptr",0, "Int",0, "uint")

; MsgBox % &hUpdate

DllCall("EndUpdateResource", "ptr", hUpdate, "uint", 0)  ; 保存到文件

; module := DllCall("BeginUpdateResource", "str", ExeFile, "uint", 0, "ptr")
; https://baike.baidu.com/item/EndUpdateResource/6374883?fr=aladdin

Run % 根目录路径生成exe

; BinRun(&hModule)

; Sleep 10000
Return

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。