モジュールは事前に知られていないため、実行時に動的に dll としてロードする必要があります。モジュールはクラス インターフェイスに準拠しているというだけです。私が気付いたのは、(メイン スレッドのメイン プログラムで) dll によってスローされた例外をキャッチした後、適切なデストラクタが呼び出され、モジュールが破棄され、dll がアンロードされた後、catch ブロックの最後の } として行ごとにステップ実行するときにVisual Studio C++デバッガーが到達すると、別の例外が発生し、プログラムがクラッシュします
xxxxx.exe の 0x68ad2377 (msvcr90d.dll) での初回例外: 0xC0000005: アクセス違反の読み取り場所 0x02958f14。
例外で中断を有効にすると、この 2 番目の例外で中断すると、場所が次のように表示されます。
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;
}