Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法将参数2从';常量位图信息*';至';常量位图信息*';_C++_Windows_Gdi - Fatal编程技术网

C++ 无法将参数2从';常量位图信息*';至';常量位图信息*';

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

我从internet下载了这段代码,并从Microsoft Visual Studio Community 2017获得以下编译错误:

错误C2664“HBITMAP CreateDIBSection(HDC,常量BITMAPINFO*,UINT,void**,句柄,DWORD)”:
无法将参数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,也没有意识到它基本上需要非标准的使用按照这个答案的建议,您的代码编译得很好,问题得到了回答…好的,谢谢您的帮助,问题解决了。错误消息不是很有用。