このアプリケーション(c ++)では、LoadLibraryを使用してサードパーティのDLLをロードします。これらのDLLにより、「アクセス違反の読み取り場所0x00000000..」などの例外が発生することがあります。
たとえば、try&catchまたはその他のメカニズムを使用して、このような例外から回復することは可能ですか?他の世界では、そのようなイベントに耐える同じプロセス内にサンドボックスを作成することは可能ですか?
ありがとうございました
このアプリケーション(c ++)では、LoadLibraryを使用してサードパーティのDLLをロードします。これらのDLLにより、「アクセス違反の読み取り場所0x00000000..」などの例外が発生することがあります。
たとえば、try&catchまたはその他のメカニズムを使用して、このような例外から回復することは可能ですか?他の世界では、そのようなイベントに耐える同じプロセス内にサンドボックスを作成することは可能ですか?
ありがとうございました
いいえ、ちがいます。DLLは、それを呼び出すプロセスコンテキストに無制限にアクセスできます。信頼できないDLLを独自のプロセスコンテキストで実行する必要があります。
Windowsでは、VisualStudioコンパイラを使用して、SEHメカニズムを使用できます。
__try
{
char* ptr = 0;
char val = *ptr;
}
__except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
{
std::cout<<"AV"<<std::endl;
}
オプション/EHaを使用します。
/EH
Visual Studioでフラグ(http://msdn.microsoft.com/en-us/library/1deeycx5%28v=vs.80%29.aspx )を試すことができますが、アクセス違反の例外は、おそらく何かをしていることを意味します大きな過ち。プログラムをクラッシュさせて、例外をキャッチするのではなく、解決しようとします。
別のタイプの例外ハンドラーを試すことができます。
__try
{
// Code that might cause an access violation goes here.
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
int code = _exception_code();
}
ただし、このようなハンドラーは、コンパイラーが(イライラして)警告するため、C++オブジェクトがスタックを巻き戻す必要があるルーチンでは使用できないことに注意してください。
クロスモジュール例外をスローすることができなくなった場合、C ++では不可能です。いずれにせよ、アプリケーションでメモリが破損するため、dllで何が問題になっているのかを調べる必要があります。ここでdllから例外をスローできない理由を確認できます:http: //www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL
Runtime-Compiled C ++の背後にいる人々は、DLLのクラッシュ処理ルーチンにStructuredExceptionHandlingと呼ばれるものを使用しています。彼らのウェブサイトを掘り下げるか、コードサンプルが必要かどうか尋ねてください。
MSDNによると、この/EHa
スイッチは「構造化例外処理例外を使用したC++例外処理」を有効にします。したがって、msvc
コンパイラを使用している場合は、これを試してみることをお勧めします。