更新与UpdateResource一个字符串表(updating a string table wi

2019-07-17 17:07发布

我问的问题在这里- 通过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中的每个画面这可能可以解释的东西递增。 基本上,我想字符串格式化为第一张图片(与多个字符串),但没有真正的想法如何做到这一点。

谢谢您的帮助。

Answer 1:

字符串资源是任何其他资源格式不同。 它们不是存储作为单独的项目,但包装成每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 );
    }
}


文章来源: updating a string table with UpdateResource