假设我有A类和B类.B继承自A类,并实现了一些虚函数。唯一的问题是B是在.dll中定义的。现在,我有一个返回类A实例的函数,但它从.dll中的静态函数中检索它,返回类B的实例。我的计划是调用创建的对象,希望有函数在.dll中执行而不是在A类中定义的函数。出于某种原因,我一直受到限制的内存访问错误。有什么我不明白会阻止这个计划的工作吗?
答案 0 :(得分:1)
C ++类不能很好地跨越DLL边界。 DLL和EXE需要使用完全相同的编译器和版本构建 - 最好是一起构建。这是因为类实现细节,如vtbl
布局/顺序以及某些标准库特性的实现(即std::string
差异)是不可移植的。不同编译器的名称修改方案在编译器/版本之间也是不可饮用的。您可以在DLL边界外可靠地公开的唯一接口是C接口。
因为我不知道这里的确切方案我不能确定,但你可能在DLL边界调用某种类型的未定义行为。
编辑:也有可能在某些时候卸载了DLL,导致在B中调用不存在的代码。
答案 1 :(得分:1)
请参阅我关于此主题的其他广泛问题和答案 - 它有帮助吗? How to work (portably) with C++ class hierarchies & dynamic linked libraries
答案 2 :(得分:0)
您是否尝试使用Visual Studio调试器进行调试?
设置调试器以捕获win32异常,方法是转到Debug菜单 - > Exceptions并标记Win32 exceptions
下Thrown
旁边的复选框。
现在使用F5激活你的exe。崩溃应警告调试器,您应该能够看到访问冲突的确切位置。