2016-04-22 36 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有趣。