質問

私は、ホストアプリケーションでSTLコンテナに格納されたデータにアクセスする必要があるDLLを持っています。 C ++は、標準的なABIを持っていない、と私は別のコンパイラをサポートしたいので、アプリケーションとDLLとの間のインターフェイスは基本的にプレーン、古いデータのままにあります。

のベクトルでは、これは比較的簡単です。 contigiousあることが保証されているので、あなたは、単に、ベクトルのメモリブロックを返すことができます:

// To return vector<int> data
virtual void GetVectorData(const int*& ptr, size_t& count) const
{
    if (!vec.empty())
        ptr = &(vec.front());

    count = vec.size();
}

今DLLは、そのインタフェースを介して、ベクトルのデータへの安全な読み取り専用アクセスを持つことができます。 DLLも同様に自身のために、ベクターにで内容をコピーし、これをラップすることができます。

しかしSTLリスト(およびdequeの)については何? DLLの境界を介したアクセスを許可する別の簡単な方法はありますか?それとも私がのGetFirst()/ GetNextの()インタフェースのいくつかの種類に頼らなければならないでしょうか?ベクトルのような単純な解決策があると便利だろうので、私は、リストの多くのためにこれを行うために必要がある場合があります。

役に立ちましたか?

解決

おそらく、あなたは/デックイテレータを一覧表示する「ハンドル」のようなものを渡すことができますか?これらのハンドル・タイプは不透明とあなたがユーザーに出荷するでしょうヘッダファイルで宣言されます。内部的には、あなたは/デックイテレータをリストするためにハンドル値をマッピングする必要があります。基本的には、ユーザーは次のようなコードを記述します:

ListHandle lhi = GetListDataBegin();
const ListHandle lhe = GetListDataEnd();

while (lhi != lhe)
{
  int value = GetListItem(lhi);
  ...
  lhi = GetNextListItem(lhi);
}

他のヒント

あなたはのDLL間のSTLオブジェクトを渡すと、各STLタイプのインスタンスをどこに注意している場合は、別のコンパイラをサポートすることができます。あなたは、いくつかのインテリジェント「DLLEXPORT」のマクロを必要とする - 私は正常にVCとgccをサポートするために、次のセットを使用します。

#ifdef WIN32
#ifdef MYDLLLIB_EXPORTS      // DLL export macros
#define MYDLLLIB_API __declspec(dllexport)
#define MYDLLLIB_TEMPLATE
#else
#define MYDLLLIB_API __declspec(dllimport)
#define MYDLLLIB_TEMPLATE extern
#endif
#else                       // Not windows --- probably *nix/bsd
#define MYDLLLIB_API
#ifdef MYDLLLIB_EXPORTS
#define MYDLLLIB_TEMPLATE
#else
#define MYDLLLIB_TEMPLATE extern
#endif
#endif // WIN32
あなたのDLLをコンパイルすると、

、MYDLLLIB_EXPORTSを定義します。 DLLであなたは、あなたが使用したい各STLタイプのインスタンスを作成することができ、例えば、リストや文字列のベクトル

MYDLLLIB_TEMPLATE template class MYDLLLIB_API std::vector<std::string>;
MYDLLLIB_TEMPLATE template class MYDLLLIB_API std::list<std::string>;
(MYDLLLIB_EXPORTSが定義されていません)あなたのDLLの

消費者は、その後、

が表示されます
extern template class __declspec(dllimport) std::vector<std::string>;

、代わりに自分自身をインスタンス化のあなたのDLLからエクスポートされたバイナリコードを使用します。

  

アプリケーションとの間のインターフェース   そして、DLLは、基本的に残ることがあります   プレーン古いデータます。

必ずしもそうではありません。あなたは同じコンパイラのバージョンが使用されていることを確認する必要があります。また、DLLとアプリケーションの間で全く同じであるSTLオブジェクトのレイアウトに影響を与える設定を構築します。

あなたが野生にDLLを解放した場合は、

、あなたはDLLの境界を越えてSTLを暴露を気にする権利があります。場合は、しかし、すべてがあなたのコントロール下にあり、純粋に内部(またはあなたが厳格にサードパーティが設定/コンパイラを構築する強制することができた場合)、あなたは問題ないはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top