为什么LoadResource/LockResource有时会返回连接的资源数据?

Phi*_*oth 3 resources winapi visual-c++

我正在使用包含许多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));
}
Run Code Online (Sandbox Code Playgroud)

大多数时候,这很好.但有时,它会返回与另一个资源连接的资源.当发生这种情况时,它在该构建中是一个持久性问题.我可以通过向相关资源添加一些空行然后重建项目来"修复"它.即使资源没有改变,它也会定期发生.

我很想知道为什么会发生这种情况.还有其他人遇到过吗?我的资源是否有一些特殊的东西导致问题?我的代码错了吗?

可悲的是,我不愿在这里发布示例资源; 它们很长,这是专有软件.

Chr*_*cke 6

你的资源特有的是你期望它们被零终止.iirc资源部分在16字节边界上对齐,这意味着每当"blob"是16字节长的倍数时,资源和下一个之间就不会有任何分隔字节.

确保使用终止零字符保存资源,或使用SizeofResource确定资源的结束位置.