当前位置:首页 > c++ > 正文内容

C++隐藏程序崩溃,让程序优雅的崩溃

xuwenyan2年前 (2021-02-18)c++176

我们的程序并不能保证是完全稳定的,当程序崩溃时会展示一个崩溃提示框给用户,这给用户带来的感觉非常不友好。当我们的程序是一个服务程序时(没有ui界面),用户可能根本就感知不到这个程序的存在,这种情况下如果程序崩溃,在不显示崩溃提示的前提下,我们只需要将这个服务程序重启就可以了,这对用户来说可能会友好很多。下面的代码将可以拦截掉程序的崩溃:

LONG _stdcall ExceptionCallBack(PEXCEPTION_POINTERS pException) {
  return EXCEPTION_EXECUTE_HANDLER;
}

void __cdecl InvalidParameterHandler(const wchar_t *, const wchar_t *, const wchar_t *, unsigned int, uintptr_t) {
  ExitProcess(0xFF);
}

void __cdecl PurecallHandler(void) {
  ExitProcess(0xFF);
}

void InitExceptionHandler() {
  ::SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
  ::_set_abort_behavior(0, _WRITE_ABORT_MSG);
  _set_invalid_parameter_handler(InvalidParameterHandler);
  _set_purecall_handler(PurecallHandler);
::SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)ExceptionCallBack);
}

int main() {
  InitExceptionHandler();
  return 0;
}
    文章作者:xuwenyan
    版权声明:本文为本站原创文章,转载请注明出处,非常感谢,如版权漏申明或您觉得任何有异议的地方欢迎与本站取得联系。

    扫描二维码推送至手机访问。

    版权声明:本文由艺文笔记发布,如需转载请注明出处。

    本文链接:https://www.xuwenyan.com/archives/147

    分享给朋友:

    “C++隐藏程序崩溃,让程序优雅的崩溃” 的相关文章

    C++实现win32窗口文件拖拽

    C++实现win32窗口文件拖拽

    如题,C++如何实现win32窗口文件拖拽,直接上代码 方法1:使用win32消息实现 此方法的弊端在于,无法过滤可以拖拽的文件,拖拽时显示的图标也默认的,无法像资源管理器那样自定义。实现步骤大致分为以下三步: 第一步:首先创建窗口时必须在exStyle加上WS_EX_ACCEP...

    C++指针*为什么靠后会比较好?

    C++指针*为什么靠后会比较好?

    大多数书中和大神的代码里,往往指针的*都是靠变量而不是靠类型的,这主要是为了不造成我们第一眼对变量类型的误解和对指针类型的误解,比如: int* p1,p2 我们一眼看上去是不是通常会觉得p1、p1都是一个int*的指针呢?因为我们通常会误把int*当作一个类型,然而无论int*还是i...

    C++如何获取控制台程序的输出内容?

    C++如何获取控制台程序的输出内容?

    很多工具程序(如ffmpeg)的进度显示往往都是以控制台字符显示的方法,我们可能需要调用这种控制台工具去完成工作,但同时又希望以友好的ui界面去显示当前的工作状态(如进度)。此时我们能想到的就是运行控制台程序,然后以某种方式去获取到控制台程序的输出,然后转换到我们的ui界面上去显示。 有多种...

    VC的ATL工程向导同时生成一个PS工程是做什么的?可以不要吗?

    VC的ATL工程向导同时生成一个PS工程是做什么的?可以不要吗?

    例如,我用VC2015的工程向导新建一个ATL的工程名字叫myAtl,那么VC会同时给我生成一个叫做myAtlPS的工程。这个myAtlPS工程是做什么的?什么情况下可以不需要它?什么情况下它又是必须存在的? PS工程是什么?可以不要吗? 这个PS工程叫做代理与存根(proxy&nbs...

    uafxcwd.lib(afxmem.obj) : error LNK2005:

    uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)"解决办法

    如果在编译MFC程序的时候出现下列及类似的错误: 1˃uafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) 已经在 LIBCMTD.lib(new...

    C++ 获取进程所在目录(进程全路径)

    C++ 获取进程所在目录(进程全路径)

    打开windows任务管理器,会看到很多的进程在运行,随机挑选一个,如何通过c++代码获取某一个进程的所在全路径呢?这也是在windows软件开发中经常遇到的需求。通过进程名获取进程全路径由于可能很多进程叫同一个名字,所以获得的结果也有可能是多个#include <windows.h...