何が起こるかというと、ウィンドウをペイントする必要があるときに.Netが呼び出されます。
どうやら.Netはこれを非常に安全にし、追加の予防措置とエラー処理を追加しました。 Paint()
今、私のPaint()
イベントは、ネイティブC++ dllを呼び出すC++/CLIラッパーdllを呼び出しました。ネイティブC++例外により、アクセス違反例外が発生しました。
これで、.Netがその例外をキャッチし、それを管理SEHException
対象オブジェクトとしてラップしました。実際のエラーポイントからすべての呼び出しスタックが失われました。
解決:
.Net例外処理の前に、例外をキャッチする必要があります。
通常の例外処理フローはネット上にありますが、このサイトは実際のフローの良い例を示しています。例外ハンドラー
.Netは例外をキャッチし、SetUnhandledExceptionFilterハンドラーが呼び出される前にそれらをラップしているようです。
AddVectoredExceptionHandler
そこで、エラーコードをチェックして致命的な例外をチェックするファーストチャンス例外ハンドラーを追加しました。
//SEH exceptions have code 0xC0000xxxx
#define SEH_TYPE (DWORD)0xC0000000L
//mask the last byte
#define SEH_MASK (DWORD)0xFF000000L
LONG WINAPI CheckForSEHException( struct _EXCEPTION_POINTERS *lpTopLevelExceptionFilter)
{
if ((lpTopLevelExceptionFilter->ExceptionRecord->ExceptionCode & SEH_MASK) == SEH_TYPE) //mask and check the last bits if it's an SEH exception
{
//handle exception here (create a dump or something)
return EXCEPTION_EXECUTE_HANDLER;
}
return EXCEPTION_CONTINUE_SEARCH;
}
例外コードはWinBase.hにあり、定義に従って実際のエラーコードを確認できます。(つまり、探しますEXCEPTION_ACCESS_VIOLATION
)