24,854
社区成员
发帖
与我相关
我的任务
分享
#include <Windows.h>
LONG WINAPI exitUnhandledExceptionFilter(
_In_ struct _EXCEPTION_POINTERS *ExceptionInfo
)
{
CHAR FileName[MAX_PATH] = { 0 };
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
GetModuleFileNameA(NULL, FileName, MAX_PATH);
g_server->CloseServer();
delete g_server;
if (!CreateProcessA(
FileName,
NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
(LPSTARTUPINFOA)&si,
&pi))
{
printf("CreateProcess failed (%d).\n", GetLastError());
MessageBeep(MB_OK);
}
exit(1);
return EXCEPTION_EXECUTE_HANDLER;
}
int main()
{
SetUnhandledExceptionFilter(exitUnhandledExceptionFilter);
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
//SetConsoleCtrlHandler((PHANDLER_ROUTINE)exitHandler, true);
int *ptr = nullptr;
*ptr = 3;
getchar();
return 0;
}
[/quote]
试了下这个方式, 在错误类型在main函数里面时, 可以有效果, 错误类型在别的被Main调用的方法里面就不行了, 还是直接退出. 我也尝试了在被调用函数的类构造函数里面写了SetUnhandledExceptionFilter(exitUnhandledExceptionFilter); 好像没有效果
[/quote]
应该不会,SetUnhandledExceptionFilter本身就是针对全局的,你再研究一下有没一个示例代码,我帮你研究下 我看过这个, 按照这个文档,好像是只能监听一部分系统事件, 但是对于程序奔溃的情况检测不到。 有没有别的方法? [quote=引用 4 楼 paschen 的回复:][quote=引用 3 楼 K_Lord 的回复:][quote=引用 1 楼 paschen 的回复:]https://docs.microsoft.com/en-us/windows/console/setconsolectrlhandler我这个测试代码是想的出现错误程序自动重启。#include <Windows.h>bool CALLBACK exitHandler(DWORD evt){ CHAR FileName[MAX_PATH] = { 0 }; STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); GetModuleFileNameA(NULL, FileName, MAX_PATH); g_server->CloseServer(); delete g_server; if (!CreateProcessA( FileName, NULL, NULL, NULL, FALSE, 0, NULL, NULL, (LPSTARTUPINFOA)&si, &pi)) { printf("CreateProcess failed (%d).\n", GetLastError()); MessageBeep(MB_OK); } exit(1);}int main(){ SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); SetConsoleCtrlHandler((PHANDLER_ROUTINE)exitHandler, true); int *ptr = nullptr; *ptr = 3; getchar(); return 0;}
#include <Windows.h>
LONG WINAPI exitUnhandledExceptionFilter(
_In_ struct _EXCEPTION_POINTERS *ExceptionInfo
)
{
CHAR FileName[MAX_PATH] = { 0 };
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
GetModuleFileNameA(NULL, FileName, MAX_PATH);
g_server->CloseServer();
delete g_server;
if (!CreateProcessA(
FileName,
NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
(LPSTARTUPINFOA)&si,
&pi))
{
printf("CreateProcess failed (%d).\n", GetLastError());
MessageBeep(MB_OK);
}
exit(1);
return EXCEPTION_EXECUTE_HANDLER;
}
int main()
{
SetUnhandledExceptionFilter(exitUnhandledExceptionFilter);
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
//SetConsoleCtrlHandler((PHANDLER_ROUTINE)exitHandler, true);
int *ptr = nullptr;
*ptr = 3;
getchar();
return 0;
}
[/quote]
试了下这个方式, 在错误类型在main函数里面时, 可以有效果, 错误类型在别的被Main调用的方法里面就不行了, 还是直接退出. 我也尝试了在被调用函数的类构造函数里面写了SetUnhandledExceptionFilter(exitUnhandledExceptionFilter); 好像没有效果
[/quote]
应该不会,SetUnhandledExceptionFilter本身就是针对全局的,你再研究一下[/quote]
谢谢了, 我再试试!有没一个示例代码,我帮你研究下 我看过这个, 按照这个文档,好像是只能监听一部分系统事件, 但是对于程序奔溃的情况检测不到。 有没有别的方法? [quote=引用 1 楼 paschen 的回复:]https://docs.microsoft.com/en-us/windows/console/setconsolectrlhandler我这个测试代码是想的出现错误程序自动重启。#include <Windows.h>bool CALLBACK exitHandler(DWORD evt){ CHAR FileName[MAX_PATH] = { 0 }; STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); GetModuleFileNameA(NULL, FileName, MAX_PATH); g_server->CloseServer(); delete g_server; if (!CreateProcessA( FileName, NULL, NULL, NULL, FALSE, 0, NULL, NULL, (LPSTARTUPINFOA)&si, &pi)) { printf("CreateProcess failed (%d).\n", GetLastError()); MessageBeep(MB_OK); } exit(1);}int main(){ SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); SetConsoleCtrlHandler((PHANDLER_ROUTINE)exitHandler, true); int *ptr = nullptr; *ptr = 3; getchar(); return 0;}
#include <Windows.h>
LONG WINAPI exitUnhandledExceptionFilter(
_In_ struct _EXCEPTION_POINTERS *ExceptionInfo
)
{
CHAR FileName[MAX_PATH] = { 0 };
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
GetModuleFileNameA(NULL, FileName, MAX_PATH);
g_server->CloseServer();
delete g_server;
if (!CreateProcessA(
FileName,
NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
(LPSTARTUPINFOA)&si,
&pi))
{
printf("CreateProcess failed (%d).\n", GetLastError());
MessageBeep(MB_OK);
}
exit(1);
return EXCEPTION_EXECUTE_HANDLER;
}
int main()
{
SetUnhandledExceptionFilter(exitUnhandledExceptionFilter);
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
//SetConsoleCtrlHandler((PHANDLER_ROUTINE)exitHandler, true);
int *ptr = nullptr;
*ptr = 3;
getchar();
return 0;
}
[/quote]
试了下这个方式, 在错误类型在main函数里面时, 可以有效果, 错误类型在别的被Main调用的方法里面就不行了, 还是直接退出. 我也尝试了在被调用函数的类构造函数里面写了SetUnhandledExceptionFilter(exitUnhandledExceptionFilter); 好像没有效果
我看过这个, 按照这个文档,好像是只能监听一部分系统事件, 但是对于程序奔溃的情况检测不到。 有没有别的方法? https://docs.microsoft.com/en-us/windows/console/setconsolectrlhandler
https://docs.microsoft.com/en-us/windows/console/setconsolectrlhandler
有没一个示例代码,我帮你研究下 我看过这个, 按照这个文档,好像是只能监听一部分系统事件, 但是对于程序奔溃的情况检测不到。 有没有别的方法? https://docs.microsoft.com/en-us/windows/console/setconsolectrlhandler我这个测试代码是想的出现错误程序自动重启。#include <Windows.h>bool CALLBACK exitHandler(DWORD evt){ CHAR FileName[MAX_PATH] = { 0 }; STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(STARTUPINFO)); si.cb = sizeof(STARTUPINFO); ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); GetModuleFileNameA(NULL, FileName, MAX_PATH); g_server->CloseServer(); delete g_server; if (!CreateProcessA( FileName, NULL, NULL, NULL, FALSE, 0, NULL, NULL, (LPSTARTUPINFOA)&si, &pi)) { printf("CreateProcess failed (%d).\n", GetLastError()); MessageBeep(MB_OK); } exit(1);}int main(){ SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX); SetConsoleCtrlHandler((PHANDLER_ROUTINE)exitHandler, true); int *ptr = nullptr; *ptr = 3; getchar(); return 0;}
#include <Windows.h>
LONG WINAPI exitUnhandledExceptionFilter(
_In_ struct _EXCEPTION_POINTERS *ExceptionInfo
)
{
CHAR FileName[MAX_PATH] = { 0 };
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
GetModuleFileNameA(NULL, FileName, MAX_PATH);
g_server->CloseServer();
delete g_server;
if (!CreateProcessA(
FileName,
NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
(LPSTARTUPINFOA)&si,
&pi))
{
printf("CreateProcess failed (%d).\n", GetLastError());
MessageBeep(MB_OK);
}
exit(1);
return EXCEPTION_EXECUTE_HANDLER;
}
int main()
{
SetUnhandledExceptionFilter(exitUnhandledExceptionFilter);
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
//SetConsoleCtrlHandler((PHANDLER_ROUTINE)exitHandler, true);
int *ptr = nullptr;
*ptr = 3;
getchar();
return 0;
}
有没一个示例代码,我帮你研究下 我看过这个, 按照这个文档,好像是只能监听一部分系统事件, 但是对于程序奔溃的情况检测不到。 有没有别的方法? https://docs.microsoft.com/en-us/windows/console/setconsolectrlhandler
#include <Windows.h>
bool CALLBACK exitHandler(DWORD evt)
{
CHAR FileName[MAX_PATH] = { 0 };
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
GetModuleFileNameA(NULL, FileName, MAX_PATH);
g_server->CloseServer();
delete g_server;
if (!CreateProcessA(
FileName,
NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
(LPSTARTUPINFOA)&si,
&pi))
{
printf("CreateProcess failed (%d).\n", GetLastError());
MessageBeep(MB_OK);
}
exit(1);
}
int main()
{
SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
SetConsoleCtrlHandler((PHANDLER_ROUTINE)exitHandler, true);
int *ptr = nullptr;
*ptr = 3;
getchar();
return 0;
}
我这个测试代码是想的出现错误程序自动重启。