【发布时间】: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 个字节,这是非标准的,足以解释不兼容。