2016-04-22 79 views
3

我正在为boost容器创建一个包装器DLL(map,vecrtor,set ..)。在我的应用程序中,我想将C++对象从DLL导出到客户端。所以我剩下两个出口选项:从DLL中导出C++对象

  1. 使用(_declspec)dllexport导出C++类并在客户端中使用。
  2. 提供一个只有纯虚函数的抽象类(如COM中的接口),并且只从DLL中导出单个方法(例如CreateMap)。

我在客户端广泛使用容器(地图,矢量..)。

任何人都可以帮助我,这将是出口的最佳方法吗?

+1

map,vector和set是模板,你打算如何将它们放在DLL中? –

+0

map,vector是Dll的私人类成员 – Ushus

+0

@ user3283893由于问题处于搁置状态,因此我无法将其作为答案发布,但请查看https://github.com/jbandela/cppcomponents这是一个C + +11只有头的库,允许您将C++对象放入DLL中,并且可以从其他编译的exe或DLL中调用它们,即使它们是用不同的C++编译器或标准库编译的。如果你想使用它,让我知道,我可以帮你开始 –

回答

2

有C++类和STL容器的DLL接口边界是非常脆弱的,高度限制为您的客户:其实,DLL和客户端的EXE必须与相同 VC++编译器版本进行构建和动态链接到相同的 CRT的味道。

构建DLL导出纯C接口更安全更好的做法。请注意,你可以使用C++ 里面的的DLL边界(这基本上是许多Win32 C接口API所做的)。

作为一种替代方案,您可以从DLL中导出纯粹的C++抽象类(接口),这基本上是COM的功能。

你可能会觉得this CodeProject article有趣。