【问题标题】:updating a string table with UpdateResource使用 UpdateResource 更新字符串表
【发布时间】:2012-12-14 19:31:39
【问题描述】:

我在这里问了这个问题 - updating STRING TABLE via UpdateResource (adding multiple strings)

现在我再问一次,因为这一次我可以为问题添加更多细节。

过去一天我一直在尝试此操作,但无济于事。 我想要的结果是这样的(我在 MSVS 中手动添加了字符串): 如您所见,多个条目,并且它是“干净的”并且可以由程序轻松访问!

现在,我的消息来源:

wstring buffer[5] = {L" Meow",L" I",L" Am",L" A",L" Dinosaur"}; // ignore the string
if (HANDLE hRes = BeginUpdateResource("Output.exe",TRUE))
{
    for (int i = 0; i < 5; i++)
    {
    wchar_t * temp;
    temp = new wchar_t[(buffer[i].length()+1)];
    wcscpy(temp,buffer[i].c_str());
    wcout << temp << endl;
    UpdateResource(hRes,RT_STRING,MAKEINTRESOURCE(1),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
                   temp, 48); //buffer[i].length()+1
    delete[] temp;
    }
    EndUpdateResource(hRes,FALSE);

}

产生:

这是错误的,因为它似乎只将最后一个字符串添加到表中,而不是之前的字符串!

当我尝试修改源时,MAKEINTRESOURCE(1) 现在是“MAKEINTRESOURCE(i)”,结果如下图所示:

成功在于它添加了所有字符串,但它似乎创建了各种字符串表,这不是我们想要的。虽然我确实注意到每张图片中的 ID 增加了 16,这可能可以解释一些事情。基本上,我希望将字符串格式化为第一张图片中的格式(使用多个字符串),但不知道如何执行此操作。

感谢您的帮助。

【问题讨论】:

  • 如何建立字符串表?有结构要填写吗?我已经查看并尝试过 StringTable 和 StringFileInfo 但无济于事。

标签: c++ c windows winapi resources


【解决方案1】:

字符串资源不同于任何其他资源格式。它们不存储为单独的条目,而是打包成每组 16 个字符串。第一组存储字符串 0 到 15,第二组存储字符串 16 到 31,依此类推。在您上面的屏幕截图中,组显示为左侧树视图中父级下方的第一级。

字符串资源的不​​同之处还在于它们存储为计数的 Unicode 字符串(没有零终止符),而不是零终止的 C 字符串。因此,例如 C 字符串 'T' 'e' 's' 't' '\0' 将存储为 0004 0054 0065 0073 0074,其中第一个 WORD 表示长度,其余 4 个 WORDs 表示 Unicode 字符。

这种资源格式的结果是,如果组内的字符串 ID 存在间隙,则必须使用长度为零的字符串来解决缺失的字符串,或者在资源格式中简单地说 0000。因此,如果您的字符串表包含 ID 为 2 和 5 的字符串,则将有一个包含 16 个条目的组 (1):0000 0000 &lt;string 2&gt; 0000 0000 &lt;string 5&gt; 0000 0000 ... 0000.

还需要一条信息,即在对UpdateResource 的调用中为lpName 参数传递哪个资源ID:由于字符串资源组只能作为一个整体进行更新,因此您必须提供组ID ,其中第一个组的 ID 为 1。从字符串 ID 计算组 ID 是使用 groupID = ( strID &gt;&gt; 4 ) + 1 完成的,而组内的相对(从零开始)偏移量是 strOffset = strID % 16。如果您查看通过 MAKEINTRESOURCE(1) 产生的结果,您现在可以看到为什么它以 ID 为 0 进入第 1 组。

将所有部分放在一起,您可以使用以下代码更新字符串资源:

void ReplaceStringTable() {

    HANDLE hRes = BeginUpdateResource( _T( "Output.exe" ), TRUE );
    if ( hRes != NULL ) {
        wstring data[] = { L"",   // empty string to skip string ID 0
                           L"Raymond",
                           L"Chen",
                           L"is",
                           L"my",
                           L"Hero!", 
                           // remaining strings to complete the group
                           L"", L"", L"", L"", L"", L"", L"", L"", L"", L""
                         };

        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_STRING,
                        MAKEINTRESOURCE( 1 ),
                        MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
                        reinterpret_cast< void* >( &buffer[ 0 ] ),
                        buffer.size() * sizeof( WORD ) );

        EndUpdateResource( hRes, FALSE );
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 2019-09-18
    • 2021-12-13
    • 1970-01-01
    • 2015-06-29
    • 2018-12-25
    相关资源
    最近更新 更多