サードパーティのライブラリを使用して簡単なタスク(ラスタライズ)を行う小さなユーティリティ(VC 2010、no clr)を作成しています。後のユーティリティは、より大きなアプリケーションで使用されます。サードパーティのライブラリでヒープが破損しているため、ユーティリティがクラッシュすることがあります。それはOKですが、Windows(Vista/2008)ではよく知られているダイアログが表示されます。「プログラムは動作を停止しました...プログラムを閉じる/デバッグしてください。私の場合は適切ではありません(サーバー側)。ユーティリティは、目に見えるエフェクトを使用せずにサイレントにクラッシュ/シャットダウンする必要があります。構造化例外ハンドラ(SEH)がヒープの破損をキャッチしない
これを行うには、処理されない例外(SetUnhandledExceptionFilter)に対してSEHをインストールしました。ハンドラは、AV(*(PDWORD)0 = 0)のような例外に対しては完全に呼び出されますが、何らかの理由でヒープの破損の場合には呼び出されません。第三者のライブラリdllのうち、アンロード中のDLLのdllmainで破損が発生します。
複数の質問があります。ハンドラが呼び出されない理由を誰でも説明できますか?そのダイアログを防ぐ他の方法はありますか?
のDllMain()特別です。 Windowsは、プロセスを大きく不安定化させることなく、失敗を許可することはできません。それはあなたのフィルタが動作しないように実行中にSEH例外をトラップします。それほど多くはできません。バグを修正してください。サーバー上でWERを無効にし、serverfault.comで質問してください –
ありがとうHans。それは理にかなっている。私は最初の問題を別の方法で解決しようとします。 –
また、場合によってはこれが問題になる可能性があります。 http://stackoverflow.com/questions/19656946/why-setunhandledexceptionfilter-cannot-capture-some-exception-but-addvectoredexc –