0

Stackoverflowにも同様の質問がたくさんあることを私は知っています。しかし、どの答えも私の問題を解決することはできません。

私はこの方法でいくつかの関数をエクスポートするDLLを作成しています:

extern "C" __declspec(dllexport) int init() { ... }

私はWindowsXPでMinGW4.4を使用しています。には例外があります。これは、 Apache Thriftを使用しているためです。また、、、、、および--ApacheThriftのクラスのinit()ようなコードがありますttransport->open()。(から継承された)例外をスローする場合があります。ttransportboost::shared_ptr<TTransport>TTransportttransport->open()TTransportExceptionTTransportExceptionstd::exception

その例外により、DLLがロードされているホストプログラムがクラッシュします。ホストプログラムは第三者によって作成されたもので、ホストプログラムのコードはありません。

したがって、私はさまよっています、なぜこのようなラッパーアプローチは役に立たないのですか(ホストプログラムは同じようにクラッシュします):

try
{
    ttransport->open();        
}
// or just catch(...)
catch (std::exception &e) // or, using TTransportException
{
    return 42;
}

誰かが私が間違っていることを言うことができますか?

例外は私のものではありません。すべてがApacheThriftsライブラリで記述されているため、選択の余地はありません。

4

1 に答える 1

1

これはSEHを介してのみサポートできます-ほとんどのC __try/ C++コンパイラは//これを提供__except__finallyます...MINGWはそれらの1つではありません...

マクロライブラリを介してSEHのサポートを追加するためのいくつかの取り組みがあります。これらは実際には本番品質ではなく、「アルファコード」のようなものです...したがって、本番での徹底的なテスト(およびおそらくいくつかの変更)なしでそれらを使用することは控えます...

もう1つのポイントは、これをMINGWで機能させたとしても、スタックの巻き戻しで問題が発生する可能性があることです。そのためには、SEH用のMINGWによって提供されていないコンパイラサポートが必要です。詳細については、こちらを参照してください。

于 2012-12-15T22:33:25.770 に答える