C++ 使用UpdateResource更新字符串表

C++ 使用UpdateResource更新字符串表,c++,c,windows,winapi,resources,C++,C,Windows,Winapi,Resources,我在这里问了一个问题- 现在我再次提问,因为这一次我可以为这个问题添加更多的细节 在过去的一天里,我一直在尝试这个方法,但没有任何实际效果。 我希望结果是这样的(我在MSV中手动添加了字符串): 正如你所看到的,有多个条目,而且它是“干净”的,可以被程序轻松访问! 现在,我的消息来源: wstring buffer[5] = {L" Meow",L" I",L" Am",L" A",L" Dinosaur"}; // ignore the string if (HANDLE hRes = Be

我在这里问了一个问题-

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

在过去的一天里,我一直在尝试这个方法,但没有任何实际效果。 我希望结果是这样的(我在MSV中手动添加了字符串): 正如你所看到的,有多个条目,而且它是“干净”的,可以被程序轻松访问!

现在,我的消息来源:

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);

}
wstring缓冲区[5]={L“喵”,L“I”,L“Am”,L“A”,L“恐龙”};//忽略字符串
if(HANDLE hRes=beginupdatesource(“Output.exe”,TRUE))
{
对于(int i=0;i<5;i++)
{
温度;
temp=new wchar_t[(缓冲区[i].length()+1)];
wcscpy(temp,buffer[i].c_str());

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

字符串资源也不同,它们存储为计数的Unicode字符串(没有零终止符)与以零结尾的C字符串相反。因此,例如,C字符串
'T''e''s''T'\0'
将存储为
0004 0054 0065 0073 0074
,其中第一个
单词
表示长度,其余4个
单词
表示Unicode字符

此资源格式的一个结果是,如果组中的字符串ID存在间隙,则丢失的字符串必须使用零长度字符串进行说明,或者在资源格式中仅使用
0000
。因此,如果字符串表中的字符串ID为2和5,则将有一个组(1)共有16个条目:
0000
0000
0000
0000
0000
0000
..
0000

还需要另外一条信息,即调用中传递给
lpName
参数的资源ID:由于字符串资源组只能作为一个整体更新,因此您必须提供组ID,其中第一个组的ID为1。根据字符串ID计算组ID时使用
groupID=(strID>>4)+1
,而组内的相对(基于零的)偏移量是
strOffset=strID%16
。如果查看通过传递
MAKEINTRESOURCE(1)
生成的结果,您现在可以了解为什么它会在组1中结束,ID为0

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

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 );
    }
}
void ReplaceStringTable(){
HANDLE hRes=BeginUpdateResource(_T(“Output.exe”),TRUE);
如果(hRes!=NULL){
wstring data[]={L”“//要跳过字符串ID 0的空字符串
L“雷蒙德”,
L“陈”,
L“是”,
“我的”,
“英雄!”,
//完成组的剩余字符串
“L”“L”“L”“L”“L”“L”“L”“L”“L”“L”“L”“L”“L”“L”“L”“L”“L”
};
向量缓冲区;
对于(尺寸指数=0;
指数(数据[index].size());
复制(数据[index].begin(),数据[index].end(),
buffer.begin()+pos);
}
更新资源(hRes,
RT_字符串,
MAKEINTRESOURCE(1),
MAKELANGID(LANG_中立,SUBLANG_默认),
重新解释强制转换(&buffer[0]),
size()*sizeof(WORD));
EndUpdateResource(hRes,FALSE);
}
}

如何构建字符串表?是否有要填写的结构?我已经查看并尝试了StringTable和StringFileInfo,但没有效果。