Jam*_*mes 8 c c++ windows resources winapi
我在这里问了这个问题 - 通过UpdateResource更新STRING TABLE(添加多个字符串)
现在我再问一遍,因为这次我可以在这个问题上添加更多细节.
过去一天我一直在尝试这个,或者说没有真正有用的东西.我希望结果是这样的(我在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);
}
Run Code Online (Sandbox Code Playgroud)
生产:
这是错的,因为它似乎只是将最后一个字符串添加到表中,而不是之前的字符串!
当我尝试修改源代码以使MAKEINTRESOURCE(1)现在为"MAKEINTRESOURCE(i)"时,结果如下图所示:
成功的事实是它添加了所有字符串,但它似乎创建了各种字符串表,这不是所期望的.虽然我注意到每张照片中的ID增加了16,这可能解释了一些问题.基本上,我希望字符串格式化为第一张图片(带有多个字符串),但不知道如何做到这一点.
谢谢您的帮助.
IIn*_*ble 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
以资源格式说明.所以,如果你的字符串表中有ID的2和5串会有一个组(1)有16项:... .0000
0000
<string 2>
0000
0000
<string 5>
0000
0000
0000
还需要一条信息,即lpName
在调用中为参数传递的资源ID UpdateResource
:由于字符串资源组只能作为整体更新,因此必须提供组ID,其中第一组的ID为1.从字符串ID计算组ID是使用groupID = ( strID >> 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 );
}
}
Run Code Online (Sandbox Code Playgroud)