0

このアプリケーション(c ++)では、LoadLibraryを使用してサードパーティのDLLをロードします。これらのDLLにより、「アクセス違反の読み取り場所0x00000000..」などの例外が発生することがあります。

たとえば、try&catchまたはその他のメカニズムを使用して、このような例外から回復することは可能ですか?他の世界では、そのようなイベントに耐える同じプロセス内にサンドボックスを作成することは可能ですか?

ありがとうございました

4

6 に答える 6

4

いいえ、ちがいます。DLLは、それを呼び出すプロセスコンテキストに無制限にアクセスできます。信頼できないDLLを独自のプロセスコンテキストで実行する必要があります。

于 2012-03-29T09:32:32.340 に答える
2

Windowsでは、VisualStudioコンパイラを使用して、SEHメカニズムを使用できます。

__try
{
  char* ptr = 0;
  char val = *ptr;
}
__except(GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION)
{
  std::cout<<"AV"<<std::endl;
}

オプション/EHaを使用します。

于 2012-03-29T09:53:15.780 に答える
1

/EHVisual Studioでフラグ(http://msdn.microsoft.com/en-us/library/1deeycx5%28v=vs.80%29.aspx )を試すことができますが、アクセス違反の例外は、おそらく何かをしていることを意味します大きな過ち。プログラムをクラッシュさせて、例外をキャッチするのではなく、解決しようとします。

于 2012-03-29T09:32:37.530 に答える
1

別のタイプの例外ハンドラーを試すことができます。

__try
{
    // Code that might cause an access violation goes here. 

}
__except (EXCEPTION_EXECUTE_HANDLER)
{
    int code = _exception_code();

}

ただし、このようなハンドラーは、コンパイラーが(イライラして)警告するため、C++オブジェクトがスタックを巻き戻す必要があるルーチンでは使用できないことに注意してください。

于 2012-03-29T09:34:53.507 に答える
1

クロスモジュール例外をスローすることができなくなった場合、C ++では不可能です。いずれにせよ、アプリケーションでメモリが破損するため、dllで何が問題になっているのかを調べる必要があります。ここでdllから例外をスローできない理由を確認できます:http: //www.codeproject.com/Articles/28969/HowTo-Export-C-classes-from-a-DLL

于 2012-03-29T09:40:04.277 に答える
1

Runtime-Compiled C ++の背後にいる人々は、DLLのクラッシュ処理ルーチンにStructuredExceptionHandlingと呼ばれるものを使用しています。彼らのウェブサイトを掘り下げるか、コードサンプルが必要かどうか尋ねてください。

MSDNによると、この/EHaスイッチは「構造化例外処理例外を使用したC++例外処理」を有効にします。したがって、msvcコンパイラを使用している場合は、これを試してみることをお勧めします。

于 2012-03-29T10:00:12.950 に答える