lockResource()返回一个指针,但返回一个未知的结构

我在Windows 7上使用visual studio 2003。

我试图将一个二进制文件embedded到Windows控制台应用程序(C ++)。 我在资源脚本(.rc文件)中添加了以下行:

SampleFile RCDATA "c:\\sample.zip" 

还添加了以下代码来访问该文件:

 HRSRC hResource = FindResource(NULL, (LPCSTR)"SampleFile", RT_RCDATA); LPVOID l = LockResource(hResource); 

现在,hResource是一个有效的句柄,LockResource也是成功的,但是指针l指向一些结构,可能是一个头,然后是我试图embedded的zip文件的实际数据。 我发现在所述头文件中的第二个DWORD是文件的大小,并且资源的名称(“SampleFile”)也出现在头文件中,但是无法find头文件的描述或至less头的大小。

正如Luke所说,你在中间缺少一个LoadResource()调用。

FindResource()本质上为你提供了一个指向资源头的指针/句柄, LoadResource()读取这个头,并给你一个值(在win32上)指向数据本身,但是曾经是一个可以在内存中移动的HGlobal。 然后你将锁定这个位置,并使用LockResource()获得一个指针。

虽然在Win32上的使用保持不变。

来自MSDN

不要试图通过使用由FindResource或FindResourceEx函数返回的句柄来锁定资源。 这样的句柄指向随机数据。

资源标题在MSDN中描述为虚构的RESOURCEHEADER结构。

这个回复很大程度上来自Raymond Chen关于16位资源管理的文章

你有一个Api函数来获取资源SizeofResource的大小。
指针指向作为资源添加的文件的开头(在你的情况下是“c:\ sample.zip”)。如果你想要的话,你可以将这个指针传递给一个解压库,或者直接写入磁盘。

谢谢您的帮助。 其实我在我的代码中有LoadResource,在复制粘贴到网站中丢失了。 但是,这与我的代码中的问题有关。 代码如下所示:(这次伪代码)HANDLE hFindHandle = FindResource(…); LoadResource(hFindHandle和modulee Handle); 然后LPVOID l = LockResource(hFindHandle);

我没有使用LoadResource的返回值,而是使用FindResource中的值,所以即使我调用LoadResource,也没有从LockResource获取正确的指针。