CreateDibSection抛出访问冲突异常

时间:2015-09-12 14:45:32

标签: c++ visual-c++ gdi

我正在尝试创建一个DIBSection,以便能够更快地渲染像素,因为SetPixel太慢了。现在,我试图像这样创建它:

void** imagePointer = NULL;
DWORD mask888[] = { 0xFF0000, 0x00FF00, 0x0000FF };

BITMAPINFO bitmapInfo = BITMAPINFO();
memset(&bitmapInfo, 0, sizeof(bitmapInfo));

memcpy(bitmapInfo.bmiColors, mask888, sizeof(mask888));

bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapInfo.bmiHeader.biWidth = LCD_WIDTH; // 160
bitmapInfo.bmiHeader.biHeight = LCD_HEIGHT; // 144
bitmapInfo.bmiHeader.biPlanes = 1;
bitmapInfo.bmiHeader.biBitCount = 32;
bitmapInfo.bmiHeader.biCompression = BI_RGB;

bitmap = CreateDIBSection(hdc, &bitmapInfo, DIB_RGB_COLORS, imagePointer, NULL, 0);

但是,当我正在执行CreateDIBSection调用时,我刚刚收到一个访问冲突异常。

抛出的异常如下:

Exception thrown at 0x76E69623 (gdi32.dll) in Emulation.exe: 0xC0000005: Access violation writing location 0x0000FF00.

您能否告诉我如何调试此问题或如何解决此问题?

非常感谢你!

1 个答案:

答案 0 :(得分:2)

<强>糟糕!您忘了阅读the documentation

你传递的void**并不指向任何内容,但该论点是:

  

ppvBits [out]指向变量的指针,该变量接收指向DIB位值位置的指针。

当然,这个空指针将被取消引用,导致未定义的行为(在您的情况下是访问冲突)。

相反,将imagePointer地址传递给ppvBits:

BYTE* imagePointer = NULL; 
...
bitmap = CreateDIBSection(hdc, &bitmapInfo, DIB_RGB_COLORS, (void**)&imagePointer, NULL, 0);