从DLL动态导入C ++类

时间:2020-03-06 14:30:18  来源:igfitidea点击:

从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建议的工厂函数思想