【问题标题】:Why are LoadResource/LockResource sometimes returning concatenated resource data?为什么 LoadResource/LockResource 有时会返回串联的资源数据?
【发布时间】:2011-03-23 14:57:44
【问题描述】:

我正在处理一个包含许多 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));
}

大多数时候,这工作正常。但是,有时它会返回与另一个资源连接的资源。发生这种情况时,这是该构建中的一个持久问题。我可以通过在有问题的资源中添加一些空白行然后重建项目来“修复”它。它会定期发生,即使资源没有改变。

我很想了解它发生的原因。有其他人遇到过吗?我的资源是否有一些特殊的东西导致了问题?我的代码错了吗?

遗憾的是,我不愿意在此处发布示例资源;它们很长,而且这是专有软件。

【问题讨论】:

  • 您可以通过进行完整的解决方案重建(清理+构建)来“修复”它而不是触及资源文件吗?不知道是不是VS缓存问题。
  • @Tergiver:遇到问题时我还没有尝试完全重建,主要是因为该项目需要永远从头开始构建。但是,为了科学的利益,我会在下次发生的时候开始。

标签: winapi visual-c++ resources


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如何确定资源的结束?您的资源文件是否以(unicode 的双精度)NULL 结尾?我认为不能保证资源在 PE 文件中以 NULL 结尾,并且您似乎将其视为字符串。

    【讨论】:

    • 谢谢,现在看起来很明显,诅咒我的假设。我为你投了赞成票,但我接受了克里斯提到SizeofResource 的回答,我不知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多