【问题标题】:cannot convert argument 2 from 'const BITMAPINFO *' to 'const BITMAPINFO *'无法将参数 2 从 'const BITMAPINFO *' 转换为 'const BITMAPINFO *'
【发布时间】:2020-03-24 03:32:10
【问题描述】:

我从互联网上下载了这段代码,并从 Microsoft Visual Studio Community 2017 得到以下编译错误:

错误 C2664 'HBITMAP CreateDIBSection(HDC,const BITMAPINFO *,UINT,void **,HANDLE,DWORD)':
无法将参数 2 从 'const BITMAPINFO *' 转换为 'const BITMAPINFO *'

我该如何解决这个问题?

typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER BitMapInfoHeader;
    RGBQUAD bmiColors[1];
} BITMAPINFO;

char * abMyBitmap = new char[sizeof(BITMAPINFOHEADER) + 100 * 100 * 4]; // ?? todo check this
const BITMAPINFO * pBitMap = (BITMAPINFO*)abMyBitmap;

HBITMAP hBitmap;
VOID * pvBits;

hBitmap = CreateDIBSection( NULL, pBitMap, DIB_RGB_COLORS, &pvBits, NULL, NULL );

【问题讨论】:

  • / ??待办事项检查这个 - 这是一个评论,因为它不会编译
  • 为什么要定义自己的 BITMAPINFO?你没有收到任何关于重复结构定义的警告吗?
  • 很可能您对 BITMAPINFO 的本地定义与您显然没有提供的 CreateDIBSection 参数的定义不匹配。根据编译设置,BITMAPINFO 的定义可能会有所不同。
  • 定义您自己的BITMAPINFO 会破坏 ODR 规则是 UB 并且不需要诊断。你很幸运编译器报告了它。解决方案删除您的定义。
  • 我现在记得 Windows 标头强制结构打包为 2 个字节,这是非标准的,足以解释不兼容。

标签: c++ windows gdi


【解决方案1】:

为什么要重新定义BITMAPINFO?它已经在wingdi.h 中定义。删除你的typedef,你的代码就可以正常编译了。

【讨论】:

  • Q 是关于编译问题的。我不关心代码的逻辑。如果代码不起作用,那将是一个不同的问题。
  • @uneven_mark 一次性分配BITMAPINFO 和相邻字节数组是常见的做法。 "A bitmap is packed when the bitmap array immediately follows the BITMAPINFO header."
  • @Botje 是的,我刚刚意识到背后的想法是什么。我实际上并不熟悉 Windows API,也没有意识到它基本上需要非标准使用。
  • 如果您按照此答案的建议一起删除typedef...BITMAPINFO;,您的代码编译得很好并且问题得到了回答...
  • 好的,谢谢您的帮助,问题已解决。错误信息不是很有帮助。
猜你喜欢
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 2018-06-08
  • 2011-07-25
  • 1970-01-01
相关资源
最近更新 更多