从DLL动态导入C ++类

时间:2008-09-21 11:52:00

标签: c++ windows dll import

从DLL导入C ++类的正确方法是什么?我们正在使用Visual C ++。

有dllexport / exports.def + LoadLibrary + GetProcAddress三元组,但它不适用于C ++类,只适用于C函数。这是由于C ++名称错误吗?我如何使这项工作?

5 个答案:

答案 0 :(得分:12)

您需要添加以下内容:

extern "C"
{
...
}

避免功能损坏。

您可以考虑编写两个简单的C函数:

SomeClass* CreateObjectInstace()
{
    return new SomeClass();
}

void ReleaseObject(SomeClass* someClass)
{
   delete someClass;
}

只使用这些功能,您可以在以后添加/更改对象创建/删除功能。这有时被称为工厂。

答案 1 :(得分:5)

http://www.codeproject.com/KB/DLL/XDllPt4.aspx

找到解决方案

感谢你们的努力女孩

答案 2 :(得分:2)

我通常声明一个接口基类,在我的应用程序中使用此声明,然后使用LoadLibrary,GetProcAddress来获取工厂函数。因子总是返回接口类型的指针。

这是一个实际的例子,exporting an MFC document/view from a DLL,动态加载

答案 3 :(得分:2)

结帐this question。基本上,有两种方法。您可以使用_dllexport标记该类,然后链接到导入库,DLL将自动加载。或者,如果您想自己动态加载DLL,可以使用@titanae建议的工厂功能概念

答案 4 :(得分:1)

dllexport / dllimport工作,将它放在头文件中的类名之前,你就可以了。

通常你想在dll中使用dllexport,在exe中使用dllimport(但是你可以在任何地方使用dllexport并且它可以正常工作,“正确”使它加载得更快)。

显然这是用于链接时编译。您可以使用/ delayload链接器指令使其“动态”,但这可能不是您想要的主题行。

如果你真的想要加载LoadLibrary样式,那么你将不得不用“extern C”包装器包装你的C ++函数。问题是因为名称损坏,你可以输入完全错误的名称并且它可以工作。

解决方法通常是提供一个返回指向正确类的指针的C函数 - COM以这种方式工作,因为它从dll导出4个C函数,用于获取dll中对象内的接口方法。