【问题标题】:LoadResource() returning hGlobal that I can't interrogate?LoadResource() 返回我无法询问的 hGlobal?
【发布时间】:2014-12-21 16:08:55
【问题描述】:

以下代码块导致 err1 = 0(成功)和 err2 = 6(无效句柄)。

    HGLOBAL hGlobal = LoadResource(hInst, hrSrc);
    INT err1 = GetLastError();
    UINT gflags = GlobalFlags(hGlobal);
    INT err2 = GetLastError();

gflags 的值为 0x8000,表示GMEM_INVALID_HANDLE。我知道资源存在,如果我锁定内存,我会得到资源中的数据。

我的问题是为什么我得到一个无效的句柄结果? LoadResource() 返回的内存是不是真的不是看起来的“特殊”HGLOBAL?

【问题讨论】:

  • 看一下 GlobalFlags() 的 MSDN 文章,它告诉您只将它用于 GlobalRe/Alloc() 返回的句柄。小心处理错误,永远不要调用 GetLastError(),除非你从函数中得到错误返回。 LoadResource 没有失败,你的 hGlobal 变量不是 NULL。

标签: winapi


【解决方案1】:

LoadResource 返回的值并不是真正的HGLOBAL

来自LoadResource 文档:

LoadResource 的返回类型是 HGLOBAL 是为了向后兼容,而不是因为函数返回一个全局内存块的句柄。不要将此句柄传递给 GlobalLock 或 GlobalFree 函数。获取资源数据第一个字节的指针,调用LockResource函数;要获取资源的大小,请调用 SizeofResource。

您对从LoadResource 返回的值所做的只是将它传递给LockResourceSizeofResource

出于向后兼容性的原因,这些函数采用这种方式。旧版本的 Windows 确实返回了真正的全局内存块。

【讨论】:

  • 该死,我在想这个。不知道我是如何在文档中错过的。谢谢。
猜你喜欢
  • 2014-09-02
  • 2019-04-04
  • 2020-07-09
  • 2015-06-27
  • 1970-01-01
  • 2011-03-23
  • 2015-09-07
  • 2020-02-25
  • 1970-01-01
相关资源
最近更新 更多