使用UpdateResource更新字符串表

时间:2012-12-30 03:27:43

标签: c++ c windows winapi resources

我在这里问了一个问题 - updating STRING TABLE via UpdateResource (adding multiple strings)

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

过去一天我一直在尝试这个,或者说没有真正有用的东西。 我希望结果是这样的(我在MSVS中手动添加了字符串): 正如您所看到的,多个条目,它是“干净的”,可以通过程序轻松访问! enter image description here

现在,我的来源:

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

}

产地: enter image description here

哪个错了,因为它似乎只是将最后一个字符串添加到表中,而不是之前的字符串!

当我尝试修改源代码以使MAKEINTRESOURCE(1)现在为“MAKEINTRESOURCE(i)”时,结果如下图所示: http://gyazo.com/5fa7a6682d5da2def4683227533b2755.png http://gyazo.com/e77f6e90cb3dbfe21d07b3d55c931acb.png http://gyazo.com/2e632768e2cdfcea8ab9cd08caea9cc8.png http://gyazo.com/f9dcd68c671923d8faefce76877bc3be.png

成功的事实是它添加了所有字符串,但它似乎创建了各种字符串表,这不是所期望的。虽然我注意到每张照片中的ID增加了16,这可能解释了一些问题。基本上,我希望字符串格式化为第一张图片(带有多个字符串),但不知道如何做到这一点。

感谢您的协助。

1 个答案:

答案 0 :(得分: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的字符串,则会有一个包含16个条目的组(1):0000 0000 <string 2> {{1 }} 0000 0000 <string 5> 0000 ... 0000

还需要一条信息,即在UpdateResource的调用中为0000参数传递的资源ID:由于字符串资源组只能作为整体更新,所以必须提供组ID,其中第一个组具有ID 1.使用lpName从字符串ID计算组ID,而组内的相对(从零开始)偏移为groupID = ( strID >> 4 ) + 1。如果您查看通过strOffset = strID % 16生成的结果,您现在可以看到它在ID为0的第1组中出现的原因。

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

MAKEINTRESOURCE(1)