【问题标题】:How to replace the RCData of an executable?如何替换可执行文件的 RCData?
【发布时间】: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 BeginUpdateResourceW function如果此参数为TRUE,则删除现有资源,更新后的文件仅包含使用UpdateResource函数添加的资源。
  • "...如果此参数为 FALSE,则更新的文件包括现有资源,除非它们被明确删除或使用 UpdateResource 替换。"
  • 如果 RcData 是文本,您可以将 *.exe 文件重命名为 *.dll,放入 Visual Studio 并进行编辑。这听起来不合法!
  • @RemyLebeau 现在问题只是代码添加了一个空行(第1行),当我清除它时,exe可以正常工作,我该如何摆脱它?
  • @Ruan 你说的“空行”根本就不是一行。这是由您放置在 wstring 字符数据前面的 WORD 长度的显示引起的。你为什么这样做?您在哪里发现 ">AUTOHOTKEY SCRIPT

标签: c++ winapi autohotkey


【解决方案1】:

您需要使用 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 ); 
    }
}

【讨论】:

    猜你喜欢
    • 2010-12-15
    • 2018-12-12
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 2017-05-15
    • 1970-01-01
    相关资源
    最近更新 更多