如何替换可执行文件的 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 ); 
    }
}