Ответ Ханса Пассанта о SetUnhandledExceptionFilter находится на правильном пути.Он также делает несколько хороших замечаний о невозможности сделать слишком много в обратном вызове, потому что различные части процесса могут находиться в нестабильном состоянии.
Однако, из описания способа, это неПохоже, вы хотите сделать что-нибудь, кроме как сказать системе не выводить нормальный диалог сбоя.В этом случае это легко и должно быть безопасно независимо от того, на какие части процесса мог повлиять сбой.
Создайте функцию примерно так:
LONG WINAPI UnhandledExceptionCallback(PEXCEPTION_POINTERS pExceptPtrs)
{
if (IsDebuggerPresent())
// Allow normal crash handling, which means the debugger will take over.
return EXCEPTION_CONTINUE_SEARCH;
else
// Say we've handled it, so that the standard crash dialog is inhibited.
return EXCEPTION_EXECUTE_HANDLER;
}
И где-нибудь в вашей программе(вероятно, как можно раньше) установите обратный вызов:
SetUnhandledExceptionFilter(UnhandledExceptionCallback);
Это должно делать то, что вы хотите - позволить любым сбоям этой конкретной программы молча умирать.
Однако есть еще кое-что дляОбратите внимание на это: каждый раз, когда вы добавляете сторонние компоненты (DLL, OCX и т. д.), существует риск того, что один из них может также вызвать SetUnhandledExceptionFilter и, таким образом, заменить ваш обратный вызов своим собственным.Однажды я столкнулся с элементом управления ActiveX, который устанавливал свой собственный обратный вызов при создании экземпляра.И что еще хуже, он не смог восстановить первоначальный обратный вызов, когда он был уничтожен.Это казалось ошибкой в их коде, но, несмотря на это, мне пришлось предпринять дополнительные шаги, чтобы гарантировать, что мой желаемый обратный вызов был восстановлен, по крайней мере, тогда, когда это должно было произойти после того, как их управление было отключено.Поэтому, если вы обнаружите, что это иногда не работает для вас, даже если вы знаете, что правильно установили обратный вызов, вы можете столкнуться с чем-то похожим.