C++ 无法将参数2从';常量位图信息*';至';常量位图信息*';
我从internet下载了这段代码,并从Microsoft Visual Studio Community 2017获得以下编译错误: 错误C2664“HBITMAP CreateDIBSection(HDC,常量BITMAPINFO*,UINT,void**,句柄,DWORD)”:C++ 无法将参数2从';常量位图信息*';至';常量位图信息*';,c++,windows,gdi,C++,Windows,Gdi,我从internet下载了这段代码,并从Microsoft Visual Studio Community 2017获得以下编译错误: 错误C2664“HBITMAP CreateDIBSection(HDC,常量BITMAPINFO*,UINT,void**,句柄,DWORD)”: 无法将参数2从“常量BITMAPINFO*”转换为“常量BITMAPINFO*” 我如何解决这个问题 typedef struct tagBITMAPINFO { BITMAPINFOHEADER BitM
无法将参数2从“常量BITMAPINFO*”转换为“常量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
?它已在wingdi.h
中定义。删除你的typedef
,你的代码就会编译好。/??todo check this-这是一条注释,因为它无法编译为什么要定义自己的BITMAPINFO?您没有收到关于重复结构定义的任何警告吗?可能是BITMAPINFO的本地定义与CreateDIBSection的参数不匹配,而您显然没有提供该参数。根据编译设置的不同,BITMAPINFO的定义可能会有所不同。定义自己的BITMAPINFO
会破坏ODR规则,因此不需要进行诊断。你很幸运,编译器报告了它。解决方案删除您的定义。我现在回忆起Windows标头强制将结构打包为2字节,这是非标准的,足以解释不兼容性。Q是关于编译问题的。我不关心代码的逻辑。如果代码不起作用,这将是另一个问题。@U标记一次性分配BITMAPINFO
和相邻字节数组是常见的做法@是的,我刚刚意识到背后的想法。实际上,我并不熟悉Windows API,也没有意识到它基本上需要非标准的使用代码>按照这个答案的建议,您的代码编译得很好,问题得到了回答…好的,谢谢您的帮助,问题解决了。错误消息不是很有用。