アンマネージド 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の間を横切るテンプレートだけです。