从DLL动态导入C ++类
从DLL导入C ++类的正确方法是什么?我们正在使用Visual C ++。
有dllexport / exports.def + LoadLibrary + GetProcAddress trifecta,但它不适用于C ++类,仅适用于C函数。这是由于C ++名称处理吗?我该如何工作?
解决方案
我通常声明一个接口基类,在我的应用程序中使用此声明,然后使用LoadLibrary,GetProcAddress获取工厂功能。该因子始终返回接口类型的指针。
这是一个实际的示例,从动态导出的DLL中导出MFC文档/视图
dllexport / dllimport可以正常工作,将其放在头文件中的类名之前,我们可以使用。
通常,我们要在dll中使用dllexport,而在exe中使用dllimport(但我们可以随处使用dllexport,并且它可以正常工作,"正确"执行此操作可使加载速度大大加快)。
显然,这是用于链接时编译的。我们可以使用/ delayload linker指令使其"动态",但这可能不是我们想要的主题行。
如果我们确实想要LoadLibrary样式的加载,则必须使用" extern C"包装器包装C ++函数。问题是由于名称修改,我们可以键入完整名称,这样就可以了。
解决方法通常是提供一个C函数,该函数以这种方式返回指向正确类COM的指针,因为它从dll中导出4个C函数,这些函数用于获取dll中对象内部的接口方法。
我们需要添加以下内容:
extern "C" { ... }
避免功能混乱。
我们可以考虑编写两个简单的C函数:
SomeClass* CreateObjectInstace() { return new SomeClass(); } void ReleaseObject(SomeClass* someClass) { delete someClass; }
通过仅使用这些功能,我们可以随后添加/更改对象创建/删除的功能。有时称为工厂。
在http://www.codeproject.com/KB/DLL/XDllPt4.aspx中找到了解决方案
谢谢你们的努力
看看这个问题。基本上有两种方法。我们可以使用_dllexport标记该类,然后与导入库链接,并且DLL将自动加载。或者,如果我们想自己动态加载DLL,则可以使用@titanae建议的工厂函数思想