VS2010MFC做的程序。请问程序如果异常退出了,怎么让计算机重启。这个监控程序如何做。

 我来答
七月流光1
2016-10-28 · TA获得超过528个赞
知道小有建树答主
回答量:339
采纳率:100%
帮助的人:190万
展开全部

在App类里面定义一个未处理异常的回调函数。例如:

static LONG ApplicationCrashHandler(EXCEPTION_POINTERS* pException);

然后在这个函数里面实现计算机重启的功能。代码你可以自己在网上查询。这里我把提权限和重启的参考代码附上:

 

   OSVERSIONINFO os;
    os.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
    GetVersionEx(&os);
    if (VER_PLATFORM_WIN32_NT == os.dwPlatformId)
    {
        HANDLE handle;
        TOKEN_PRIVILEGES tkp;

        OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &handle);
        LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid);

        tkp.PrivilegeCount = 1;
        tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

        AdjustTokenPrivileges(handle, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

        if (GetLastError() != ERROR_SUCCESS)
        {
            MessageBox(NULL, TEXT("AdjustTokenPrivileges error"), TEXT("error"), MB_OK | MB_ICONERROR);
        }
    }

    ExitWindowsEx(EWX_REBOOT, 0);

在App类的InitInstance成员函数的前面加上下列语句:

SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)App);

这个函数的功能是在整个进程出现了未处理异常的时候,就会把他交给ApplicationCrashHandler来处理,这个函数里面我们是做了重启操作,因而能达到程序崩溃后能重启计算机的目的。


上面是在目标进程中来实现程序崩溃后重启计算机的,不需要另外单独写一个监控程序。如果需要单独写监控程序来做一个守护进程,可以用进程快照或者枚举进程来实现,这种做法缺点是用户更改了程序名就会出现问题,更好的做法是用内核对象来实现,在目标进程中申请一个内核对象,监控进程中打开这个内核对象,如果能打开就说明目标进程存在,否则表示不存在目标进程,就可以重启计算机了。这种做法记得在程序异常的时候关闭内核对象,否则当程序崩溃的时候,弹出了标准的异常对话框,内核对象的生存周期还在,就无法达到程序崩溃的时候重启计算机了。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式