【问题标题】:Having trouble writing HGLOBAL DIB data to file将 HGLOBAL DIB 数据写入文件时遇到问题
【发布时间】:2011-10-24 22:45:44
【问题描述】:

我正在使用一个捕获卡 dll,它导出一个函数,该函数提供一个包含 DIB 的 HGLOBAL 句柄。我想将此DIB写入文件。锁定资源并检索数据指针后,我请求大小,大约为 1mb。但是当我将它写入文件时,它总是 0 字节。这是我第一次使用 HGLOBAL 类型,所以我猜我做错了什么。感谢您的帮助。

char* dibData = (char*)LockResource(DIB);
if(NULL != dibData)
{
    SIZE_T dibSize = GlobalSize (DIB);
    f = fopen("thedib.dib", "wb");

    if (f)
    {
        n = fwrite(dibData,dibSize,1,f);
        fflush(f);
        fclose(f);
        wrote = true;
    }

    UnlockResource(DIB);
}

【问题讨论】:

  • SizeofResource(DIB) 的结果是什么? msdn.microsoft.com/en-us/library/windows/desktop/ms648048.aspx
  • 如果我做 DWORD dibSize = SizeofResource (NULL,(HRSRC)DIB);然后 dibsize=0。
  • 我想知道 LockResource 是否是必要的,因为这个图像不是来自可执行文件。
  • 我想自然的问题是您是如何/从哪里获得 DIB 的?

标签: c winapi gdi


【解决方案1】:

您似乎在混合使用资源 API 和全局内存 API。如果它真的是资源,请使用 LockResource()、SizeofResource()、UnlockResource()。如果只是通过 GlobalAlloc() 分配的内存块,请使用 GlobalLock()、GlobalSize()、GlobalUnlock()。

此外,.bmp 文件应以 BITMAPFILEHEADER 结构开头。内存中的 DIB 不存在此结构,因此您需要在写入 DIB 数据之前写入该结构。

http://msdn.microsoft.com/en-us/library/dd183374%28v=vs.85%29.aspx

【讨论】:

  • 如果我这样做 DWORD dibSize = SizeofResource (NULL,(HRSRC)DIB); 然后 dibsize=0。如果我解决了这个问题,我一定会写位图标题。
  • 在 LockResource 之后设置断点(应该是 GlobalLock ?)并检查 dibData 指向的内存。如果它是一个有效的 DIB,第一个 DWORD 将为 40(0x28 十六进制),这是 BITMAPINFOHEADER 的大小。
  • 我使用了 GlobalLock 并解决了问题。谢谢
猜你喜欢
  • 1970-01-01
  • 2020-06-15
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多