0

私は DLL プロジェクトで Boost を使用してきましたが、Boost の依存関係をまだエクスポートしていません。C 型と DLL ソース ツリー自体から派生したものだけです。

しかし今、私はロック可能なデータ モデルに苦労しています... 設計された例外セーフを取得できず、ブースト型を DLL インターフェイスに直接エクスポートしません。

struct DLL_EXPORT DllTestData {
    double test1;
    double test2;

    void lock();
    void unlock();
    DllTestDataLock getGuard();

    boost::mutex;
}

そしてそれを使用します:

DllTestData ptr;
ptr->lock();
ptr->test1 = 1.0;
ptr->unlock(); 

少なくとも、おそらくある種のDllTestData::Pimplを設計し、Dll からミューテックス タイプを隠すことができます。しかし、次のように使用したい場合:

DllTestData ptr;
{
    auto g = ptr->getGuard();
    ptr->test1 = 1.0;
}

これを書いている間、私はILockable -Interface について考え始め、PImpl などでミューテックス型を非表示にしているので、次のようになります。

struct ILockable {
    void lock() = 0;
    void unlock() = 0;
}

struct DLL_EXPORT DllTestData : public struct ILockable {
    /// ...
private:
    class PImpl;
    Pimpl * impl;
}

struct Guard {
    Guard( ILockable * ptr ) {
        ptr->lock();
    }
    ~Guard() {
        ptr->unlock();
    }
}

そして、次のように使用します。

DllTestData ptr = fromDll();
{
    Guard g(ptr);
    ptr->test1 = 1.0;
}

これは有効なアプローチでしょうか (pimpl でミューテックス タイプを非表示にし、Lockable インターフェイスで動作します)、またはこれで間違った方向に進んでいますか? または、このシナリオでは何がうまくいくでしょうか? たぶん、boost::mutex PImpl 全体をインターフェイスに移動しますか?

4

1 に答える 1

0

はい、私の意見では、あなたは正しい軌道に乗っています。ただし、構造体は非常に「重い」ため、値自体ではなく、値の get および set メソッドを使用してインターフェイスとしてエクスポートする必要があります。ファクトリ パターンを使用すると、オブジェクトを作成するための 1 つの関数と削除するための 1 つの関数を使用して、厄介な Pimpl * impl を公開することなく、dll 内のインターフェイスから安全に派生させることができます。

もう一度見てみると、ミューテックスの公開をまったく回避できます。たとえば、両方の値のみを一度に設定する必要がある場合は、

void setValues(double test1,double test2);

メソッド内で、ミューテックスを自分で設定できます。または、大きな get および set リストが必要ない場合は、より古典的な Win32 アプローチ: 次のようなメソッドなしで構造体を公開します。

struct DLLTestData
{
double test1;
double test2;
// …and as many as you want 
};

次のように関数またはメソッドをエクスポートに追加します

void setTestData(DLLTestData value);

ライブラリ内で、構造体全体をロックして memcpy できます。前に述べたように、私は Win32 API を頻繁に使用するときは 2 番目の方法に慣れていますが、個人的には、より手間がかかるとしても、インターフェイスと get/setter を使用する最初の方法を好みます。

于 2013-09-01T14:36:21.260 に答える