......
BITMAPINFOHEADER bi; bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bmpScreen.bmWidth;
bi.biHeight = bmpScreen.bmHeight;
bi.biPlanes = ;
bi.biBitCount = bmpScreen.bmBitsPixel;
bi.biCompression = BI_RGB;
bi.biSizeImage = ;
bi.biXPelsPerMeter = ;
bi.biYPelsPerMeter = ;
bi.biClrUsed = ;
bi.biClrImportant = ; DWORD dwBmpSize = ((bmpScreen.bmWidth * bi.biBitCount + ) / ) * * bmpScreen.bmHeight; cBmpData = new unsigned char[dwBmpSize ];
GetDIBits(hdcScreen, hbmScreen, , (UINT)bmpScreen.bmHeight, cBmpData, (BITMAPINFO *)&bi, DIB_RGB_COLORS); DeleteObject(bmpScreen); ReleaseDC(hdcScreen);
return cBmpData;
} <---运行到这里时提示堆栈损坏
这是因为其实GetDIBits的第五个参数需要的其实是一个BITMAPINFO结构,而我们传入的是
BITMAPINFOHEADER。
如果在位图不小于16位时,这是可行的。但是在位图小于16位时,它还需要另外的内存空间来储存一个调色板数据,所以就会发生堆栈损坏的错误。
正确的做法是这样的
struct { BITMAPINFO info; RGBQUAD moreColors[]; } fbi;
BITMAPINFOHEADER &bi = fbi.info.bmiHeader;
bi.biSize = sizeof(BITMAPINFOHEADER);
...
GetDIBits(..., &fbi.info, ...);