如何替换可执行文件的 RCData?
How to replace the RCData of an executable?
我正在尝试修改已编译的 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 无法正常运行,我该如何摆脱它?
您需要使用 std::string
而不是 std::wstring
,因为 AHK 需要 8 位字符,而不是 16 位字符。此外,您需要摆脱您的 vector
,因为 AHK 不希望每行都以其长度作为前缀。
试试这个:
void ReplaceStringTable() {
HANDLE hRes = BeginUpdateResource( TEXT( "C:\Users\CAIO\Documents\Github\main\scripts\ahkDebug\Novo(a) AutoHotkey Script.exe" ), FALSE );
if ( hRes != NULL ) {
std::string data = "MsgBox Test";
UpdateResource( hRes,
RT_RCDATA,
L">AUTOHOTKEY SCRIPT<", //MAKEINTRESOURCE( 1 ),
1033, //MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
const_cast<char*>(data.c_str()),
data.size() );
EndUpdateResource( hRes, FALSE );
}
}
我正在尝试修改已编译的 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 无法正常运行,我该如何摆脱它?
您需要使用 std::string
而不是 std::wstring
,因为 AHK 需要 8 位字符,而不是 16 位字符。此外,您需要摆脱您的 vector
,因为 AHK 不希望每行都以其长度作为前缀。
试试这个:
void ReplaceStringTable() {
HANDLE hRes = BeginUpdateResource( TEXT( "C:\Users\CAIO\Documents\Github\main\scripts\ahkDebug\Novo(a) AutoHotkey Script.exe" ), FALSE );
if ( hRes != NULL ) {
std::string data = "MsgBox Test";
UpdateResource( hRes,
RT_RCDATA,
L">AUTOHOTKEY SCRIPT<", //MAKEINTRESOURCE( 1 ),
1033, //MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
const_cast<char*>(data.c_str()),
data.size() );
EndUpdateResource( hRes, FALSE );
}
}