C++ 使用UpdateResource更新字符串表
我在这里问了一个问题- 现在我再次提问,因为这一次我可以为这个问题添加更多的细节 在过去的一天里,我一直在尝试这个方法,但没有任何实际效果。 我希望结果是这样的(我在MSV中手动添加了字符串): 正如你所看到的,有多个条目,而且它是“干净”的,可以被程序轻松访问! 现在,我的消息来源: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
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,但没有效果。