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

时间:2012-01-05 14:05:57

标签: windows winapi visual-c++

我在Windows 7上使用visual studio 2003。

我正在尝试将二进制文件嵌入到Windows控制台应用程序(c ++)中。 我在资源脚本(.rc文件)中添加了以下行:

SampleFile RCDATA  "c:\\sample.zip"

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

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

现在,hResource是一个有效的句柄,LockResource也成功但指针l指向一些结构,可能是一个标题,后面是我试图嵌入的zip文件的实际数据。 我设法发现所述标题中的第二个DWORD是文件的大小,资源的名称(“SampleFile”)也出现在标题中,但无法找到标题的描述或在至少是标题大小。

3 个答案:

答案 0 :(得分:3)

卢克说,你在中间错过了LoadResource()电话。

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

虽然Win32上的用法保持不变。

来自MSDN

  

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

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

这个回复主要来自Raymond Chen关于16-bit resource management

的文章

答案 1 :(得分:0)

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

答案 2 :(得分:0)

感谢您的帮助。 实际上我的代码中确实有LoadResource,它在复制粘贴到网站时丢失了。 但是,这与我的代码中的问题有关。 代码看起来像这样:(这次是伪造的代码) HANDLE hFindHandle = FindResource(...); LoadResource(hFindHandle和Module Handle); 然后 LPVOID l = LockResource(hFindHandle);

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