1

アンマネージド C++ dll と動的にリンクするマネージド C++ dll があります。マネージ C++ は、アンマネージ dll の抽象インターフェイスからいくつかのアンマネージ クラスを派生させます。

これはうまくいきます。アンマネージ dll の ICustomer.h

//  uses macro __declspec(dllexport)
class EXPORT_API ICustomer
{
public:
    virtual void PlaceOrder() = 0;
    //...
};  

マネージ C++ の LocalCustomer.h

#include "unmanagedlib/ICustomer.h"

//an unmanaged derived class defined in the managed dll
class LocalCustomer : public ICustomer
{
public:
    void PlaceOrder();
    //...
};  

LocalCustomer はマネージド dll で使用されます。アンマネージ dll の関数に渡すことができ、すべて正常に動作します。

これが問題です。テンプレートを公開するインターフェイスを実装しようとすると、起動時に STATUS_INVALID_IMAGE_FORMAT が発生します。

実行されません。アンマネージ DLL で

stuct Order
{
    double price;
    //...
};

template<typename T>
class EXPORT_API ICollection<T>
{
    //...
};

class EXPORT_API IFactory
{  
public:
    virtual ICollection<Order>& GetOrders() = 0;
}

マネージ C++ dll で

class OrderCollection : public ICollection<Order>
{
    //...
};

class LocalFactory : public IFactory
{
public:
    virtual ICollection<Order>& GetOrders() { return m_orders; }
private:
    OrderCollection m_orders;
};

テンプレートのオーバーライド GetOrders を絞り込みました。マネージ dll にコードがあると、「アプリケーションを正しく開始できませんでした (0xc000007b)」というダイアログが開きます。これは、マネージ ローダーによって STATUS_INVALID_IMAGE_FORMAT HRESULT がスローされるだけです。コードを削除すると、実行できるようになります。 ? マネージ DLL で使用できないのはなぜですか。

もう 1 つの手がかりです。これが気晴らしであるかどうかはわかりません..私は 32 ビット アプリをコンパイルし、Win7 x64 で実行しています。私が言ったように、テンプレートが dll をアンマネージドからマネージドに渡らない限り、問題なく動作します。

私を殺すのは、マネージド dll 内に完全に存在するいくつかのアンマネージド C++ テンプレートがあり、それらが正常に動作することです。私に悪いイメージを与えているように見えるのは、dllの間を横切るテンプレートだけです。

4

2 に答える 2

2

確かではありませんが、一般的な (テンプレート) クラスを dll からエクスポートすることはできないようです。テンプレートは、ビルド時にコードで参照されるとインスタンス化されます。これは、ビルド時にテンプレートのソース コードを表示する必要があることを意味しますが、そうではありません。コンパイル済みの dll がありますが、テンプレートのインスタンス化はどのように期待できますか?

于 2010-07-20T14:41:34.030 に答える
0

したがって、回避策は、アンマネージ テンプレートの実装を独自のアンマネージ実装 dll に移動することでした。テンプレート パラメーターを公開するインターフェイスは、h ファイルを介して公開できます。しかし、マネージ dll 内にテンプレートを実装できなかったようです。だから基本的に

[基本ライブラリがテンプレート dll を公開] -> [テンプレート dll を実装] -> [マネージ C++ dll]

h ファイルがテンプレート クラスの実装を隠している限り、すべて問題ありませんでした。

于 2010-07-21T16:22:00.660 に答える