从 DLL 导出 C++ 对象

3
我正在创建一个包装器DLL,用于boost容器(map、vector、set等)。在我的应用程序中,我想将C++对象从DLL导出到客户端。因此,我只剩下两个导出选项:
  1. 使用(_declspec)dllexport导出C++类,并在客户端中使用。
  2. 提供一个仅含纯虚函数的抽象类(如COM中的接口),并从DLL中仅导出单个方法(例如CreateMap)。
我在客户端广泛使用这些容器(map、vector等)。
请问有人可以帮助我,哪种导出方法最好?

1
map、vector和set是模板,您打算如何将它们放入DLL中? - el.pescado - нет войне
map和vector是Dll的私有类成员。 - Ushus
由于问题被暂停,我无法将此作为答案发布,但请查看https://github.com/jbandela/cppcomponents。这是一个C++11头文件库,允许您将C++对象放入DLL中,并能够从其他已编译的exe或DLL调用它们,即使它们使用不同的C++编译器或标准库。如果您想使用它,请告诉我,我可以帮助您入门。 - John Bandela
1个回答

2
在DLL接口边界处使用C++类和STL容器非常脆弱,并且对您的客户具有高度限制性:实际上,DLL和客户端EXE必须使用相同的VC++编译器版本构建,并动态链接到相同的CRT版本。
构建导出“纯C接口”的DLL要更安全、更好的做法。请注意,您可以在DLL边界内部使用C++(这基本上是许多Win32 C接口API所做的)。
作为替代方案,您可以从DLL中导出纯C++抽象类(“接口”),这基本上就是COM所做的事情。
您可能会发现这篇CodeProject文章很有趣。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接