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

时间:2010-07-31 12:05:40

标签: winapi visual-c++ resources

我正在使用包含许多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));
}

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

您如何确定资源的结束?您的资源文件以(unicode为double)NULL结尾吗?我认为没有任何保证PE文件中的资源是NULL终止的,并且您似乎将其视为字符串。