如何获知程序异常??(高分求教) 当程序A运行异常的时候经常会弹出“内存不可读或写”等之类的对话框,确认后程序退出。作为看门狗程序B: 1)怎样才能获知程序A已经运行异常? 2)怎样关掉该对话框,我试过给该对话框发ID_OK消息,但不起作用?望那位高手帮忙指点一下,不胜感激。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 既然已经运行异常,那么这个进程就会被Windows咔嚓掉,B程序只要检查A程序的进程是否还存在就可以了……关掉对话框只要PostMessage到那个窗口就可以了,PostMessage原型如下BOOL PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); newbiestar() 兄: Windows并没有把我运行异常的进程咔嚓掉,而是弹出了个“内存不可读或写”等之类的对话框,必须要人工去确认后进程才会被退出。 其实我的程序B一直在监测程序A是否还在运行,如果没在运行我就自动将其运行,但程序B并不知道程序A已运行异常。就算我知道多了个“内存不可读或写”等之类的对话框,但我给该对话框发::PostMessage(hWnd, WM_COMMAND, IDOK, 0),却不起作用,我试过对其它窗口发送该消息好使,郁闷。 还望赐教。 1)既然是看门狗程序就要象喂看门狗一样定时由A向B发送消息或事件,如果B到时未收到事件或消息就表明A运行异常了2)在程序A类应该加入异常处理,B程序结束A在异常时通常只有TerminateProcess 我觉得可这样试一试: B中建一定时器.定时查A的弹出框,VC一般的错误框的标题为:"mfctest: mfctest.exe - 应用程序错误"形式,你可看一下,把它作为FindWindow的参数如以下程序: HWND hd=FindWindow(NULL,"mfctest: mfctest.exe - 应用程序错误"); if (hd==NULL) { return; } HWND hd1=FindWindowEx(hd,NULL,NULL,"确定"); if (hd1==NULL) { return; } int id=::GetDlgCtrlID(hd1); ::SendMessage(hd,WM_COMMAND, MAKELONG(id,BN_CLICKED),(long)hd1); //这样就可关闭对话框 多谢qrlvls和keiy兄,我现在还是不知道如果已经知道程序异常了,但怎样才能将其关闭。 arlvls兄说可通过TerminateProcess,但我通过FindWindow可获取程序的主窗口句柄,但怎样通过窗口句柄来获取进程句柄呢?能否给予指点。还有更好的方法吗? keiy兄的建议对我很有帮助,特别是用于关闭弹出窗口,多谢。 我会尽快结账。多谢各位。 先用DWORD GetWindowThreadProcessId( HWND hWnd, // handle to window LPDWORD lpdwProcessId // address of variable for process identifier);得到进程的ID,再用HANDLE OpenProcess( DWORD dwDesiredAccess, // access flag BOOL bInheritHandle, // handle inheritance flag DWORD dwProcessId // process identifier);得到进程HANDLE.就可以用TerminateProcess了 多谢Everybody,先结账,但希望大家能继续探讨。 手工添加菜单 图标为何灰化 菜鸟问题,mfc 我的单文档多视图。中,视图竟然没有办法获取文档指针 ? 【求助】一个关于使用CxImage库的问题,请各位指点 谁有完整的DX7.0 SDK? 或者有DX7.0里面DirectDraw的ddex1那4个例子源代码? 有了解汽车诊断设备开发的兄弟吗?希望了解这一行的兄弟们进来聊聊 如何有一个资源的句柄得到该资源的ID号? 各位高手,哪儿有 Windows 下的QT 库安装程序下栽?? winmain的问题 *** 我的程序退不出来了,救救我! *** 请教高手:如何用程序控制网卡? 怎样用比较简洁的语句添加数据库记录?
BOOL PostMessage(
HWND hWnd,
UINT Msg,
WPARAM wParam,
LPARAM lParam
);
Windows并没有把我运行异常的进程咔嚓掉,而是弹出了个“内存不可读或写”等之类的对话框,必须要人工去确认后进程才会被退出。
其实我的程序B一直在监测程序A是否还在运行,如果没在运行我就自动将其运行,但程序B并不知道程序A已运行异常。就算我知道多了个“内存不可读或写”等之类的对话框,但我给该对话框发::PostMessage(hWnd, WM_COMMAND, IDOK, 0),却不起作用,我试过对其它窗口发送该消息好使,郁闷。
还望赐教。
2)在程序A类应该加入异常处理,B程序结束A在异常时通常只有TerminateProcess
B中建一定时器.定时查A的弹出框,VC一般的错误框的标题为:
"mfctest: mfctest.exe - 应用程序错误"形式,你可看一下,把它作为FindWindow的参数
如以下程序:
HWND hd=FindWindow(NULL,"mfctest: mfctest.exe - 应用程序错误");
if (hd==NULL)
{
return;
}
HWND hd1=FindWindowEx(hd,NULL,NULL,"确定");
if (hd1==NULL)
{
return;
}
int id=::GetDlgCtrlID(hd1);
::SendMessage(hd,WM_COMMAND, MAKELONG(id,BN_CLICKED),(long)hd1); //这样就可关闭对话框
arlvls兄说可通过TerminateProcess,但我通过FindWindow可获取程序的主窗口句柄,但怎样通过窗口句柄来获取进程句柄呢?能否给予指点。还有更好的方法吗?
keiy兄的建议对我很有帮助,特别是用于关闭弹出窗口,多谢。
我会尽快结账。多谢各位。
DWORD GetWindowThreadProcessId(
HWND hWnd, // handle to window
LPDWORD lpdwProcessId // address of variable for process identifier
);
得到进程的ID,再用
HANDLE OpenProcess(
DWORD dwDesiredAccess, // access flag
BOOL bInheritHandle, // handle inheritance flag
DWORD dwProcessId // process identifier
);
得到进程HANDLE.就可以用TerminateProcess了