我必须在运行时动态地将模块加载为 dll,因为它们事先并不知道,只是它们符合类接口。我注意到的是,在我捕获 dll 抛出的异常(在主线程的主程序中)之后,调用了正确的析构函数并销毁了模块并卸载了 dll,但随后作为 catch 块末尾的 } Visual Studio C++ 调试器在逐行执行时到达,我得到另一个异常,它使程序崩溃
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;
}