CRT エラーでクラッシュするサードパーティの C ライブラリがあります。この場合、プロセス全体がクラッシュします。すべての CRT エラーをキャッチしてプロセスの終了を防ぐ方法はありますか。
3 に答える
クラッシュを防ぐことは、おそらく問題を遅らせるだけです。
クラッシュを防ぐことができたとしても、その結果、ユーザーが誤ったデータをデータベースに保存したり、データ ファイルを破損したりすると、問題が悪化するだけです。
代わりに、正確な問題が何であるかを調べてみてください。
- サードパーティ ライブラリの関数に間違った引数を渡していませんか?
- それともサードパーティのライブラリのバグですか? ライブラリの製造元にバグを突きつけます。
または:
- 問題の回避策を見つけようとする
- ライブラリの代替を見つける
編集: 正直に言うと、昨年、サードパーティのコンポーネントで同じ状況に遭遇しました。私がしたことは次のとおりです。
まず、 _try / _except 構造を使用して問題をキャッチします。これは、どの関数呼び出しで正確にクラッシュするかがわかっている場合にのみ機能します。それはこのように動作します:
__try
{
Some3rdPartyLibraryFunction();
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
}
次に、アプリケーションのさらなる破損を防ぐために、アプリケーション内でサードパーティのライブラリが呼び出されないようにしてください。たとえば、ライブラリがレポート コンポーネントである場合、クラッシュが発生した場合、次のように、ユーザーがレポートを開くことを許可しないでください。
bool MyClass::openReport (char *reportname)
{
if (!reportModuleEnabled)
return false;
__try
{
OpenTheReport(reportname);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
// Tell the user about the problem and prevent further access to the library
ShowMessage ("Sorry, no more reports");
reportModuleEnabled = false;
return false;
}
return true;
}
あなたのプログラムは Windows で動作しますか? 問題のあるコードを SEH でラップしてみましたか? http://msdn.microsoft.com/en-us/library/windows/desktop/ms680657(v=vs.85).aspx
残念なことに、誰も要点を理解していません。CRT エラーは SEH に関するものではないため、 _try ..._except ではキャッチできません。CRT エラーを処理する _set_invalid_parameter_handler および _set_purecall_handler 関数を使用する必要があります。
http://crashrpt.sourceforge.net/docs/html/exception_handling.html