以下代码块导致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真的不是它的样子吗?
答案 0 :(得分:4)
LoadResource
返回的值实际上不是HGLOBAL
。
来自LoadResource
文档:
LoadResource的返回类型是HGLOBAL,用于向后兼容,而不是因为该函数返回全局内存块的句柄。不要将此句柄传递给GlobalLock或GlobalFree函数。要获取指向资源数据第一个字节的指针,请调用LockResource函数;要获取资源的大小,请调用SizeofResource。
您使用LoadResource
返回的值所做的就是将其传递给LockResource
和SizeofResource
。
出于向后兼容的原因,这些功能就是这种方式。旧版本的Windows确实返回了真正的全局内存块。