実行時に動的にdllとしてモジュールをロードする必要があります。これは、クラスインタフェースに準拠しているためです。私が気づいたのは、(メインスレッドのメインプログラムの)dllによってスローされた例外を捕まえた後、右のデストラクタが呼び出され、モジュールが破棄され、dllがアンロードされた後、catchブロックの最後に}プログラムをクラッシュする別の例外が発生するdll例外をキャッチした後のアクセス違反
xxxxx.exeの0x68ad2377(msvcr90d.dll)の最初の例外:0xC0000005:アクセス違反の場所0x02958f14を読み取るアクセス違反。
私は例外で破り有効にした場合、この第二の例外に破壊する
msvcr90d.dllとしての位置を示しています!__ DestructExceptionObject(EHExceptionRecord * pExcept = 0x0017ee4c、unsigned char型fThrowNotAllowed = 0)ライン1803 + 0xFのバイト
しかし、フレームスタックが破損している可能性があります。なぜこの例外がスローされるのか分かりません。次のように
私のコードの構造を簡略化したバージョンがある:プログラムの
非常に簡単な構造:
//shared header:
class Module
{
public:
virtual void Foo(void) = 0;
};
//dll:
class SomeSpecificModule : public Module
{
public:
virtual void Foo(void);
};
void SomeSpecificModule::Foo(void)
{
throw 1;
}
extern "C" __declspec(dllexport) Module* GetModule()
{
return new SomeSpecificModule;
}
//program:
typedef ptrGetModule* (*GetModule)();
int main(void)
{
HANDLE hMod = LoadLibrary("SomeSpecificModule.dll");
ptrGetModule GetModule = (ptrGetModule)GetProcAddress(hMod, "GetModule");
try
{
Module *d = GetModule();
d->Foo();
}
catch (...)
{
cout << '!' << endl;
}
return 0;
}
スタックトレース全体を投稿してください –