【发布时间】:2021-11-24 10:45:57
【问题描述】:
我正在尝试修改已编译 AutoHotkey 脚本的 RCData:
void ReplaceStringTable() {
HANDLE hRes = BeginUpdateResource( _T( "C:\\Users\\CAIO\\Documents\\Github\\main\\scripts\\ahkDebug\\Novo(a) AutoHotkey Script.exe" ), FALSE );
if ( hRes != NULL ) {
std::wstring data[] = { L"MsgBox Test" };
std::vector< WORD > buffer;
for ( size_t index = 0;
index < sizeof( data ) / sizeof( data[ 0 ] );
++index ) {
size_t pos = buffer.size();
buffer.resize( pos + data[ index ].size() + 1 );
buffer[ pos++ ] = static_cast< WORD >( data[ index ].size() );
copy( data[ index ].begin(), data[ index ].end(),
buffer.begin() + pos );
}
UpdateResource( hRes,
RT_RCDATA,
L">AUTOHOTKEY SCRIPT<", //MAKEINTRESOURCE( 1 ),
1033, //MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
reinterpret_cast< void* >( &buffer[ 0 ] ),
buffer.size() * sizeof( WORD ) );
EndUpdateResource( hRes, FALSE );
}
}
但是,这是运行代码后的结果:
代码确实添加了一个空行(第1行),这行使exe无法正常工作,我该如何摆脱它?
【问题讨论】:
-
引用documentation of
BeginUpdateResourceWfunction:如果此参数为TRUE,则删除现有资源,更新后的文件仅包含使用UpdateResource函数添加的资源。 -
"...如果此参数为 FALSE,则更新的文件包括现有资源,除非它们被明确删除或使用 UpdateResource 替换。"
-
如果 RcData 是文本,您可以将 *.exe 文件重命名为 *.dll,放入 Visual Studio 并进行编辑。这听起来不合法!
-
@RemyLebeau 现在问题只是代码添加了一个空行(第1行),当我清除它时,exe可以正常工作,我该如何摆脱它?
-
@Ruan 你说的“空行”根本就不是一行。这是由您放置在 wstring 字符数据前面的 WORD 长度的显示引起的。你为什么这样做?您在哪里发现 ">AUTOHOTKEY SCRIPT
标签: c++ winapi autohotkey