2011-09-20 4 views
5

LoadLibraryGetProcAddressを使用してDLL内の関数を呼び出すVisual Studio 6で書かれたアプリケーション(私はFMLをよく知っています)に取り組んでいます。新しいコードはVC6でコンパイルできず、新しいコンパイラが必要です。 DLLにはC++オブジェクトを構築する関数がいくつかあり、VC6プログラムはそのオブジェクトを抽象クラスで使います。MSVC6はextern "C"関数からの例外をどのように処理できますか?

これはうまくいきますが、GetProcAddressで検索された関数が例外をスローすると、例外がDLL内でキャッチされても問題になります。私は、抽象クラスのメソッドが例外をスローしたときにこれが起こらないことに気づいた。その場合、物事は正常に機能します。

私はここで間違っていますか? VC6で例外を正しく処理するコードを生成させるにはどうすればよいですか?

編集は:

extern "C" __declspec(dllexport) Box* getBox(const char* addr) 
{ 
    try { 
     return createBox(addr); 
    } catch (std::exception& ex) { 
     LOG_ERROR("Open failed: " << ex.what()); 
     return 0; 
    } catch (...) { 
     LOG_ERROR("Error while opening."); 
     return 0; 
    } 
} 
+2

すべてのモジュールがmsvcランタイムの同じインスタンスを使用していますか? –

+2

これは問題ではありません。 –

+0

@Brian DLL内のすべてのハンドラをキャッチしていますか?例外をキャッチしないハンドラの例を見ることができますか? –

答えて

1

あなたはそのような継承クロスコンパイラのバージョンを実行することはできません。ここでは、プログラムがクラッシュする関数の例です。ほとんど動作しますが、例外やその他のいくつかのことは狂っています。

+1

私はいつもあなたのdllが長生きするならば、C++ではなくpublicインターフェイスをCに制限するべきだと言っています。 – rodrigo

+1

ここでの問題はインターフェイスにありません。例外がキャッチされる前にプログラムを中止してください。例外はDLL境界を越えることを目的としたものではなく、DLLコード内でスローされ、完全にキャッチされます。 – Brian

+0

問題は、ABIの互換性がランタイムを混乱させるように壊れていることです。 – Joshua

関連する問題