2015-09-12 127 views
-1

我想創建一個DIBSection以便能夠更快地渲染像素,因爲SetPixel太慢了。現在,我想,像這樣創建:CreateDibSection拋出訪問衝突異常

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. 

你能告訴我如何調試這個或如何解決這個問題?

非常感謝您提前!

回答

2

哎呀!你忘了閱讀the documentation

你傳遞一個void**不指向任何東西,但是這說法是:

ppvBits [out]的指針,該接收一個指向DIB位值的位置的變量。

當然,這個空指針會被解除引用,導致未定義的行爲(並且在你的情況下是訪問衝突)。

反而,imagePointer通過地址ppvBits:

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

非常感謝你。 – Andreas