【问题标题】:CreateDibSection throws Access Violation ExceptionCreateDibSection 引发访问冲突异常
【发布时间】:2015-12-08 23:54:22
【问题描述】:

我正在尝试创建一个 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.

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

非常感谢您!

【问题讨论】:

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


    【解决方案1】:

    哎呀!你忘了看the documentation

    你传递了一个不指向任何东西的void**,但这个参数是:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 2012-11-14
      相关资源
      最近更新 更多