在App类里面定义一个未处理异常的回调函数。例如:
static LONG ApplicationCrashHandler(EXCEPTION_POINTERS* pException)然后在这个函数里面实现计算机重启的功能。代码你可以自己在网上查询。这里我把提权限和重启的参考代码附上:
OSVERSIONINFO osos.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来处理,这个函数里面我们是做了重启 *** 作,因而能达到程序崩溃后能重启计算机的目的。
上面是在目标进程中来实现程序崩溃后重启计算机的,不需要另外单独写一个监控程序。如果需要单独写监控程序来做一个守护进程,可以用进程快照或者枚举进程来实现,这种做法缺点是用户更改了程序名就会出现问题,更好的做法是用内核对象来实现,在目标进程中申请一个内核对象,监控进程中打开这个内核对象,如果能打开就说明目标进程存在,否则表示不存在目标进程,就可以重启计算机了。这种做法记得在程序异常的时候关闭内核对象,否则当程序崩溃的时候,d出了标准的异常对话框,内核对象的生存周期还在,就无法达到程序崩溃的时候重启计算机了。
这种情况一般都是由于程序不兼容或者程序本身存在BUG发生的。升级应用程序或者下个其他类似的软件应该能解决问题另外Android系统针对程序反映慢或程序异常时为了避免整个系统的死机而设计的方式,偶尔出现一下的话是正常的。
若频繁出现,建议您尝试 *** 作以下:
1、可能是由于XX程序数据异常了。建议您尝试到手机的“系统设置--应用程序--已下载”下,找到提示异常的程序,点击进入“清除数据”后观察使用。
2、有可能是由于一些第三方软件的冲突干扰导致的,建议您尝试卸载最近安装的可疑软件,或是备份下机身的重要资料(联系人、短信等)后,再 *** 作一下恢复设备的出厂设置看看能否改善。
若无法 *** 作如上,或是无法有效解决,我们建议您抽空到当地的联想售后服务中心,让工程师帮忙检测、解决。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)