从DLL导入C ++类的正确方法是什么? 我们正在使用Visual C ++。
有dllexport / exports.def + LoadLibrary + GetProcAddress trifecta,但它不适用于C ++类,只有C函数。 这是由于C ++的名称? 我该如何做这项工作?
您需要添加以下内容:
extern "C" { ... }
避免功能混乱。
你可能会考虑编写两个简单的C函数:
SomeClass* CreateObjectInstace() { return new SomeClass(); } void ReleaseObject(SomeClass* someClass) { delete someClass; }
通过仅使用这些函数,您可以随后添加/更改对象创建/删除的功能。 这有时被称为工厂。
我通常声明一个接口基类,在我的应用程序中使用这个声明,然后使用LoadLibrary,GetProcAddress来获取工厂函数。 该因子总是返回接口类型的指针。
这里是一个实际的例子, 从DLL中导出一个MFC文档/视图 ,动态加载
看看这个问题 。 基本上有两种方法。 您可以使用_dllexport标记该类,然后与导入库链接,并且该DLL将自动加载。 或者如果你想自己动态地加载DLL,你可以使用@titanae建议的工厂函数的想法
dllexport / dllimport的作品,把它放在你的类名称在头文件,你很好去。
通常你想在dll中使用dllexport,在exe中使用dllimport(但是你可以在任何地方使用dllexport,它的工作原理是“正确的”,使得加载速度更快)。
很明显,这是链接时编译。 您可以使用/ delayload链接器指令使其成为“动态”,但这可能不是您想要的主题行。
如果你真的想要LoadLibrary样式加载,你将不得不用“extern C”包装来包装你的C ++函数。 问题是因为名字混乱,你可以输入完整的名称,它会工作。
解决方法通常是提供一个C函数,返回一个指向正确的类的指针 – COM以这种方式工作,因为它从dll导出4个C函数,用于获取dll中对象内的接口方法。