我问的问题在这里- 通过UpdateResource更新字符串表(添加多个字符串)
现在我再次问,因为这时候我可以很多添加更多详情的问题。
我一直在试图为这个过去一天或某事没有真正的结果。 我想要的结果是是这个样子(我手动添加在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
s为的Unicode字符。
这种资源格式的结果是,如果一个组内也有在字符串ID差距缺少的字符串必须要考虑与零长度字符串,或只是0000
资源格式说话。 所以,如果你的字符串表中有ID的2和5串会有一个组(1)16项: 0000
0000
<string 2>
0000
0000
<string 5>
0000
0000
... 0000
。
还是有一个更多的资料片要求,即通过对这些资源ID lpName
在调用参数UpdateResource
:由于字符串资源组只能作为一个整体进行更新,你必须提供组ID,其中第一组具有ID 1.从字符串ID计算的组ID与进行groupID = ( strID >> 4 ) + 1
,而相对的(基于零的)的基团是内的偏移strOffset = strID % 16
。 如果你看一下从通过产生的结果MAKEINTRESOURCE(1)
你现在可以看到为什么它在第1组结束了为0的ID。
把所有的拼在一起,你可以用下面的代码更新字符串资源:
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 );
}
}