CreateDIBSection()失败-如何诊断

时间:2019-05-13 16:15:44

标签: c++ windows visual-studio winapi

我调用CreateDIBSection()并返回0。文档说这意味着“一个或多个输入参数无效”,但没有迹象表明哪个参数是无效。

我看到了一个this这样的问题,该问题的结尾是“在CreateDIBSection之后,我发现错误代码是8,没有足够的资源”-这让我感到困惑-在其中没有提及任何错误代码documentation。张贴者如何获得这些额外信息?

编辑:根据要求,这是我的代码-我必须道歉它不完整-它是一个庞大程序的一部分,并且制作一个最小的winapi程序也不是简单的事情。

HDC hdcTemp;
BYTE* bitPointer;

hdcTemp = CreateCompatibleDC(hdc_desktop);

my_printf("GetDeviceCaps(hdcTemp,BITSPIXEL) = %d\n",GetDeviceCaps(hdcTemp,BITSPIXEL)); // this prints "32"

static BITMAPINFO bitmap;

bitmap.bmiHeader.biSize = sizeof(bitmap.bmiHeader);
bitmap.bmiHeader.biWidth = 280;
bitmap.bmiHeader.biHeight = height_to_check;
bitmap.bmiHeader.biPlanes = 1;
bitmap.bmiHeader.biBitCount = 32;
bitmap.bmiHeader.biCompression = BI_RGB;
bitmap.bmiHeader.biSizeImage = 280 * 4 * height_to_check;
bitmap.bmiHeader.biClrUsed = 0;
bitmap.bmiHeader.biClrImportant = 0;

HBITMAP hBitmap2 = CreateDIBSection(hdcTemp, &bitmap, DIB_RGB_COLORS, (void**)(&bitPointer), NULL, NULL);

2 个答案:

答案 0 :(得分:1)

更改为

BYTE* bitPointer;
HDC hdcScreen = GetDC(NULL);
static BITMAPINFO bitmap;

bitmap.bmiHeader.biSize = sizeof(bitmap.bmiHeader);
bitmap.bmiHeader.biWidth = 280;
bitmap.bmiHeader.biHeight = height_to_check;
bitmap.bmiHeader.biPlanes = 1;
bitmap.bmiHeader.biBitCount = 32;
bitmap.bmiHeader.biCompression = BI_RGB;
bitmap.bmiHeader.biSizeImage = 280 * 4 * height_to_check;
bitmap.bmiHeader.biClrUsed = 0;
bitmap.bmiHeader.biClrImportant = 0;

HBITMAP hBitmap2 = CreateDIBSection(hdcScreen, &bitmap, DIB_RGB_COLORS, (void**)(&bitPointer), NULL, NULL);
ReleaseDC(NULL, hdcScreen);

即不要将从CreateCompatibleDC返回的HDC传递给CreateDIBSection;使用屏幕的设备上下文。

调用CreateCompatibleDC会创建一个与1x1单色位图关联的设备上下文,无论传入的HDC是什么,因此在创建与该HDC兼容的位图或DIB节时,Win32会尝试与不需要的单色位图兼容

答案 1 :(得分:-1)

目前,MSDN指出“一个或多个输入参数无效”是合理的。测试表明,如果位图太大或输入值无效(例如零),则将返回NULL。