2011-02-08 5 views
3

におけるDLLのクラッシュをキャッチ:いくつかのケースではが、私はこのように、DLLから関数を呼び出していますC/C++

__declspec (dllimport) bool dll_function(...); 

int main() { 
    [...] 
    if (dll_function(...)) { 
    [...] 
    } 
} 

、私はDLL関数に渡すデータは、のクラッシュにつながりますDLL。これをキャッチすることは可能なので、私のアプリケーションは(私によって作成されていないDLLを変更することなく)クラッシュすることはありませんか?

+2

dllは例外をスローしますか?それともバグですか? – Marlon

+0

DLLは例外をスローしません。無効なメモリにアクセスしようとしますが、Windowsは一般的なエラーダイアログを表示し、その後はアプリケーションが実行を継続しません。 – schnaader

+0

私たちは機能を見ることができます...? – GManNickG

答えて

4

MSVCコンパイラでは、__tryキーワードと__exceptキーワードを使用してAVを捕捉できます。そのすべてが有用ではありませんが、あなたはどのような種類の被害が行われたか分かりません。プログラムの状態が壊れている可能性があります。例えばヒープが吹き飛ばされ、その後のランダムな障害が発生する可能性があります。独自のプロセスでDLLをホストし、IPCを使用してDLLを話すことは、まともなアプローチです。

0

これが問題なのかどうかわからない場合は、正しい呼び出し規約を指定してみてください。 (__stdcall,__cdeclなど)。

これは問題ではない場合は、関数に渡すものと、関数コードを持っている場合は関数コードを確認する必要があります。いくつかのケースでは

+0

この呼び出しはうまくいくはずです。ほとんどの場合、この機能があります。また、無効な入力データでもクラッシュするDLL関数のスタンドアロンの実行可能バージョンがあります。私はクラッシュを修正することができないだろうと確信している、ちょうどそれを処理する方法を知りたい。 – schnaader

2

、私は DLL関数に渡すデータは DLLのクラッシュにつながります。この をキャッチすることは可能ですか? としてアプリケーションがクラッシュしないようにしますか?

有効なデータで関数を呼び出すだけでは、DLLがクラッシュするのを防ぐことはできませんか?それはどんな場合でも望ましい解決策であるはずですが、使用したいDLLを知らなくてもそれを伝えるのは難しいです。しかし、ほとんどの場合、あなたは「データ」は、正確にクラッシュにつながるどのような考えを持っている必要があります...

+0

OK、もう少し詳しく:これは私のプログラムのためですPrecomp(http://schnaader.info/precomp.php)私が呼び出す関数はPackJPGのJPG再圧縮関数です(http://www.elektronik.htw-aalen。 de/packjpg /)。 PackJPGのクラッシュを引き起こす(無効な)JPGがあり、これを防ぐには、JPGの検出/解析を改善する必要があります。これはクラッシュを捕まえて処理するよりもはるかに努力していると思います)。 – schnaader

1

を見て試してみてください。

http://msdn.microsoft.com/en-us/library/ms680634%28v=vs.85%29.aspx

オレグStarodumovによってフィルターコードを強制します(www.debuginfo.com)

http://www.debuginfo.com/articles/debugfilters.html

しかし、それはトップレベルのフィルタおよびないのtry/catchです。おそらくプロセスを再開することができます。

例外には__tryを使用する必要があります。もう一度、おそらく問題を修正するか、単にそれをキャッチしようとするよりもクラッシュする方が良いでしょう。 クラッシュを抑制または隠すのではなく、修正する必要があることに同意します。私はあなたがクラッシュからどのくらいうまく回復できるかは分かりません。そのようなことの後に実行を続けることは役に立つでしょうか?

関連する問題