2016-04-22 16 views
3

私はブーストコンテナ用のラッパーDLLを作成しています(map、vecrtor、set ..)。私のアプリケーションでは、C++オブジェクトをDLLからクライアントにエクスポートしたいと考えています。だから私はエクスポートのための2つのオプションが残っている:DLLからC++オブジェクトをエクスポートする

  1. (_declspec)dllexportを使用してエクスポートし、クライアントで使用する。
  2. 純粋な仮想関数(COMのインターフェイスなど)のみを持つ抽象クラスを用意し、DLLから単一のメソッド(たとえばCreateMap)をエクスポートします。

私は、クライアントでコンテナ(マップ、ベクトル..)を広範囲に使用しています。

誰かが私を助けてくれますか?それはエクスポートに最適な方法でしょうか?

+1

マップ、ベクトル、セットはテンプレートですが、どのようにそれらをDLLに配置しますか? –

+0

map、vectorはDllのプライベートクラスメンバーです – Ushus

+0

@ user3283893質問が保留されているため、これを回答として投稿することはできませんが、https://github.com/jbandela/cppcomponentsを参照してください。C + DLLにC++オブジェクトを配置し、別のC++コンパイラまたは標準ライブラリでコンパイルされていても、他のコンパイル済みのexeまたはDLLから呼び出すことができる+11ヘッダー専用ライブラリです。それを使用したい場合は、私に知らせてください。 –

答えて

2

DLLインタフェースの境界でC++クラスとSTLコンテナを持つことは非常に壊れやすいですし、非常にあなたの顧客のための制約:実際には、DLLとクライアントのEXEの両方が同じ VC++コンパイラのバージョンで構築され、かつ動的にリンクされなければなりませんCRTのフレーバーであると同じです。

純粋なCインターフェイスをエクスポートするDLLをビルドする方がずっと安全で、より良い方法です。 には、の中にのDLL境界(これは基本的に多くのWin32 CインターフェイスAPIで行われています)を使用できます。

代わりに、純粋なC++抽象クラス(インターフェイス)をDLLからエクスポートすることができます。これは基本的にCOMが行うものです。

this CodeProject articleが面白いかもしれません。

関連する問題