如何替换可执行文件的RCData资源并解决多余空行问题
问题原因
你当前的代码逻辑是按照Windows字符串表资源的格式构造缓冲区,每个字符串前加了2字节的长度前缀,但已编译AutoHotkey脚本的RCData资源存储规则是不带任何前缀的UTF-16LE纯文本内容,你多加的长度前缀就是文件开头多出的不可见字符,在编辑器中会被识别为空行,也会导致AutoHotkey加载脚本时解析失败。
修复方案
删除多余的长度前缀写入逻辑,直接将脚本内容写入缓冲区即可,修改后的参考代码如下:
void ReplaceAhkScriptResource() { HANDLE hRes = BeginUpdateResource(_T("C:\\Users\\CAIO\\Documents\\Github\\main\\scripts\\ahkDebug\\Novo(a) AutoHotkey Script.exe"), FALSE); if (hRes != NULL) { // 直接把完整脚本内容写入单个宽字符串,多行用\n分隔即可 std::wstring ahkScript = L"MsgBox Test"; std::vector<WORD> buffer(ahkScript.begin(), ahkScript.end()); UpdateResource( hRes, RT_RCDATA, L">AUTOHOTKEY SCRIPT<<", 1033, reinterpret_cast<void*>(buffer.data()), buffer.size() * sizeof(WORD) ); EndUpdateResource(hRes, FALSE); } }
注意事项
- 如果需要写入多行脚本,直接在
std::wstring中用\n分隔不同行即可,不需要拆分为数组单独处理 - 不需要额外加字符串结束符,AutoHotkey会按资源长度读取完整内容
内容的提问来源于stack exchange,提问作者user17032581
相关产品推荐
相关产品推荐

