Stack around the variable 'info' was corrupted.

codebm 2010-10-04 06:37:20
新建个WIN32项目(非空),把这段代码覆盖原有的WndProc函数

在DEBUG就会Stack around the variable 'info' was corrupted.

求解



LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
//static BITMAPINFO info;
switch (message)
{
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// 分析菜单选择:
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:

{
//
//HDC hdcScreen = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
HDC hdcScreen = GetDC(NULL);

HDC hdc = GetDC(hWnd);
//一个memory dc和一个bitmap(ddb)
HDC hCompatibleDC = CreateCompatibleDC(hdcScreen);
HBITMAP hBitMap = CreateCompatibleBitmap(hdcScreen, GetDeviceCaps(hdcScreen, HORZRES), GetDeviceCaps(hdcScreen, VERTRES));
::SelectObject(hCompatibleDC, hBitMap);

//拷贝surface的数据到bitmap里
::BitBlt(hCompatibleDC, 0, 0, GetDeviceCaps(hdcScreen, HORZRES), GetDeviceCaps(hdcScreen, VERTRES), hdcScreen, 0, 0, SRCCOPY);



//ddb->dib
BITMAPINFO info;
::memset(&info, 0, sizeof(info));
info.bmiHeader.biBitCount = 4;
info.bmiHeader.biSize = sizeof(info.bmiHeader);
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biCompression = BI_RGB;

info.bmiHeader.biWidth = GetDeviceCaps(hdcScreen, HORZRES);
info.bmiHeader.biHeight = GetDeviceCaps(hdcScreen, VERTRES);
char *buff = new char[GetDeviceCaps(hdcScreen, HORZRES) * GetDeviceCaps(hdcScreen, VERTRES) * 3];
if(!GetDIBits(hCompatibleDC, hBitMap, 0, GetDeviceCaps(hdcScreen, VERTRES), buff, &info, DIB_PAL_COLORS))
::MessageBox(hWnd, NULL, NULL, MB_OK);;

//dib->surface

SetDIBitsToDevice(hdc, 0, 0, GetDeviceCaps(hdcScreen, HORZRES), GetDeviceCaps(hdcScreen, VERTRES), 0, 0, 0, GetDeviceCaps(hdcScreen, VERTRES), buff, &info, DIB_PAL_COLORS);
/* */
//释放
delete []buff;
buff = 0;
::DeleteDC(hCompatibleDC);
::DeleteObject(hBitMap);
ReleaseDC(hWnd, hdc);
ReleaseDC(NULL, hdcScreen);

//DeleteDC(hdcScreen);
}//DestroyWindow(hWnd);


break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}

...全文
1067 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
colander 2011-12-07
  • 打赏
  • 举报
回复
delete之后赋成0不会错的,这样可以防止野指针。

但是不知道为什么会栈溢出,我也遇到过类似的问题,到底怎么回事啊?
hexuyue520 2011-11-02
  • 打赏
  • 举报
回复
溢出,这属于溢出了吧
codebm 2010-10-05
  • 打赏
  • 举报
回复
个人习惯。。

以免再用buff的时候引起问题

这个又不影响。
傻X 2010-10-04
  • 打赏
  • 举报
回复
你那个buff=0;是啥,不都delete了还用buff?

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧