while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message != WM_TIMER) { TranslateMessage(&msg); DispatchMessage(&msg); }WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141f2f, int 1) line 179 对应的是DispatchMessage(&msg);
看一下出错时msg的内容,是什么消息
HEAP[HSV_CONSL.exe]: HEAP: Free Heap block 170018 modified at 170080 after it was freed 对已经释放的东东又去赋值或者调用了。你自己添加了什么代码,在“就是我从菜单打开一个子画面,然后再关闭这个画面的时候就会出现这个问题.”子画面里面。
HEAP[HSV_CONSL.exe]: HEAP: Free Heap block 170018 modified at 170080 after it was freed ----------------------------- 从错误信息分析,是堆释放后在170080处被修改.按10楼给的方法,找到对应的代码,看看是什么命令改变了其中内容.
我对VC++不是很清楚,不知道该从何查起啊...... 就是点一个画面的OK按钮就出现这个问题了.
没有“重试”按钮啊,只有[OK]按钮,点了OK,底下也没有变量.
这时候停了程序,有下面的信息.
HEAP[HSV_CONSL.exe]: HEAP: Free Heap block 170018 modified at 170080 after it was freed
这个错误是哪里来的?
用F5运行程序,出错后,用鼠标右击VC的菜单栏或工具栏,选择“Call Stack”,这个窗口会列出程序运行到当前位置所调用的各个函数,双击可以定位到源代码上,找出自己的代码再分析原因。
NTDLL! 7c989a2e()
NTDLL! 7c9669a9()
NTDLL! 7c9ae062()
NTDLL! 7c98a5d0()
NTDLL! 7c9668ad()
KERNEL32! 7c809988()
MSCTF! 746615c0()
MSCTF! 7467bf2a()
MSCTF! 7467ca8a()
MSCTF! 7467c015()
MSCTF! 74682a58()
MSCTF! 74683535()
MSCTF! 7467f539()
MSCTF! 7467faff()
USER32! 77cf8709()
USER32! 77cf87eb()
USER32! 77cfb368()
USER32! 77cfb3b4()
NTDLL! 7c94eae3()
USER32! 77cfe010()
UXTHEME! 58733c20()
UXTHEME! 5874e300()
UXTHEME! 58731ac7()
UXTHEME! 5873367a()
USER32! 77cfe02b()
USER32! 77d07593()
USER32! 77d04bcc()
USER32! 77d075bf()
USER32! 77cf8709()
USER32! 77cf87eb()
USER32! 77cfb368()
USER32! 77cfb3b4()
NTDLL! 7c94eae3()
USER32! 77cfe010()
UXTHEME! 58733c20()
UXTHEME! 587587b4()
UXTHEME! 58731ac7()
UXTHEME! 5873367a()
USER32! 77cfe02b()
USER32! 77d07593()
USER32! 77d04bcc()
USER32! 77d075bf()
USER32! 77cf8709()
USER32! 77cf87eb()
USER32! 77cf89a5()
USER32! 77cfbccc()
WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141f2f, int 1) line 179 + 12 bytes
WinMainCRTStartup() line 198 + 54 bytes
KERNEL32! 7c816d4f()这是CALL STACK 的内容.帮我分析一下,谢谢
if (msg.message != WM_TIMER) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141f2f, int 1) line 179
对应的是DispatchMessage(&msg);
当然也可以用BoundsChecker等工具检查一下。
-----------------------------
从错误信息分析,是堆释放后在170080处被修改.按10楼给的方法,找到对应的代码,看看是什么命令改变了其中内容.
// ウィンドウを破棄する
DestroyWindow(lpSystemParam->hSytemParamDlg);
memset(lpSystemParam, '\0', sizeof(SYSTEMPARAM));
这两句有没有问题啊?
谢谢大家了!VOID cnslSystemParameterInputDlg(VOID)
{
LPWINDOWINFO lpWnd;
LPSYSTEMPARAM lpSystemParam;
PROPSHEETPAGE PropSheetPage;
PROPSHEETHEADER PropSheetHeader;
HPROPSHEETPAGE hPropSheetPage[PAGECNT];
static CHAR strTitleEdit[1024];
int cntPage; lpWnd = &gSysInfo.WindowInfo;
lpSystemParam = &lpWnd->SystemPara; if (lpSystemParam->hSytemParamDlg == NULL) {
// プロパティーシートページ定義構造体の設定
PropSheetPage.dwSize = sizeof(PROPSHEETPAGE);
PropSheetPage.dwFlags = PSP_DEFAULT;
PropSheetPage.hInstance = lpWnd->hInstance;
// メッセージパラメータページ作成
PropSheetPage.pszTemplate = MAKEINTRESOURCE(IDD_SYSPARA_MSG);
PropSheetPage.pfnDlgProc = (DLGPROC)cnslSystemParamMessageDlgProc;
hPropSheetPage[PAGE_MESSAGE] = CreatePropertySheetPage(&PropSheetPage);
// プロパティーシートヘッダ構造体の設定
memset(&PropSheetHeader, 0, sizeof(PROPSHEETHEADER));
PropSheetHeader.dwSize = sizeof(PROPSHEETHEADER);
PropSheetHeader.dwFlags = PSH_NOAPPLYNOW | PSH_MODELESS;
PropSheetHeader.hInstance = lpWnd->hInstance;
PropSheetHeader.hwndParent = lpWnd->hConsoleMsgDlg;
PropSheetHeader.nPages = cntPage;
PropSheetHeader.phpage = hPropSheetPage;
PropSheetHeader.pszCaption = WTITLE_SYSPARAMSET; // プロパティーシート作成
lpSystemParam->hSytemParamDlg = (HWND)PropertySheet(&PropSheetHeader);
}
else {
// システムパラメータ設定ダイアログを最前面に
SetWindowPos((HWND)lpSystemParam->hSytemParamDlg, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
}
return;
}LRESULT CALLBACK cnslSystemParamMessageDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
UINT uiRet = 0;
LPWINDOWINFO lpWnd;
LPSYSTEMPARAM lpSystemParam;
char cBuff[256]; lpWnd = &gSysInfo.WindowInfo;
lpSystemParam = &lpWnd->SystemPara; // メッセージ毎の処理を行う
switch (uMsg) {
case WM_INITDIALOG:
lpSystemParam->hMessageParamDlg = hWnd;
// 画面に表示
cnslSystemParamMessageInitProc();
return (TRUE);
case WM_NOTIFY:
switch (((NMHDR*)lParam)->code) {
// キャンセルボタン
case PSN_QUERYCANCEL:
// ウィンドウを破棄する
DestroyWindow(lpSystemParam->hSytemParamDlg);
memset(lpSystemParam, '\0', sizeof(SYSTEMPARAM));
break;
// CLOSEする
case PSN_RESET:
break;
// OKボタン
case PSN_APPLY:
// ウィンドウを破棄する
DestroyWindow(lpSystemParam->hSytemParamDlg);
// RIC NO を初期化0に設定 // lu 2000/03/26
icntRic=0;
memset(lpSystemParam, '\0', sizeof(SYSTEMPARAM));
}
break;
default:
// デフォルト処理
return (FALSE);
}
return (FALSE);
}