【发布时间】:2010-11-01 08:45:16
【问题描述】:
我必须在运行时动态地将模块加载为 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;
}
【问题讨论】:
-
请发布整个堆栈跟踪
标签: c++ exception dll virtual access-violation