我正在使用包含许多HTML资源的Visual Studio C ++项目。它们由一个如下所示的方法加载:
LPCTSTR loadHTML(HMODULE hModule, LPCTSTR sResourceName)
{
HRSRC hResource = FindResource(hModule, sResourceName, RT_HTML);
if(!hResource)
return 0;
HGLOBAL hResourceData = LoadResource(hModule, hResource);
if(!hResourceData)
return 0;
return reinterpret_cast<LPCTSTR>(LockResource(hResourceData));
}
大部分时间,这都很好。但有时,它会返回与另一个资源连接的资源。当发生这种情况时,它在该构建中是一个持久性问题。我可以通过向相关资源添加一些空行然后重建项目来“修复”它。即使资源没有改变,它也会定期发生。
我很想知道为什么会发生这种情况。还有其他人遇到过吗?我的资源是否有一些特殊的东西导致问题?我的代码错了吗?
可悲的是,我不愿在这里发布示例资源;它们很长,这是专有软件。
答案 0 :(得分:6)
您的资源特有的是您希望它们被终止。 iirc资源部分在16字节边界上对齐,这意味着每当“blob”是16字节长的倍数时,资源和下一个资源之间就不会有任何分隔字节。
确保使用终止零字符保存资源,或使用SizeofResource确定资源的结束位置。
答案 1 :(得分:3)
您如何确定资源的结束?您的资源文件以(unicode为double)NULL结尾吗?我认为没有任何保证PE文件中的资源是NULL终止的,并且您似乎将其视为字符串。