我在这里问的问题-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,这可能解释了一些事情。基本上,我希望将字符串格式化为第一张图片中的格式(使用多个字符串),但不知道如何做到这一点。
谢谢你的帮助。

最佳答案

字符串资源不同于任何其他资源格式。它们不是作为单独的条目存储,而是打包成每组16个字符串的组。第一组存储字符串0到15,第二组存储字符串16到31,依此类推。在您的屏幕截图中,组将显示为树状视图中父级下面的第一层,朝左。
字符串资源也不同,因为它们存储为计数的Unicode字符串(不带零终止符),而不是以零终止的C字符串。例如,C字符串'T' 'e' 's' 't' '\0'将存储为0004 0054 0065 0073 0074,其中第一个WORD表示长度,其余4个WORD表示Unicode字符。
这种资源格式的一个结果是,如果一个组中的字符串id中有间隙,则必须用零长度的字符串来解释丢失的字符串,或者在资源格式中简单地说就是0000。因此,如果字符串表中的字符串具有IDs 2和IDs 5,那么将有一个包含16个条目的组(1):00000000<string 2>00000000<string 5>000000000000lpNameUpdateResourcegroupID = ( strID >> 4 ) + 1。。。strOffset = strID % 16
还需要另外一条信息,即要为MAKEINTRESOURCE(1)调用中的参数传递哪个资源ID:因为字符串资源组只能作为一个整体更新,所以必须提供组ID,其中第一个组的ID为1。从字符串ID计算组ID是用完成的,而组内的相对(基于零的)偏移量是。如果您查看通过产生的结果,现在您可以看到为什么它最终出现在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 );
    }
}

07-25 22:50
查看更多