2010-07-20 52 views
1

我有一個託管的C++ DLL,它與一個非託管的C++ DLL動態鏈接。託管的C++從非託管dll中的抽象接口派生出幾個非託管類。託管C++中的非託管C++模板會拋出錯誤的圖像?

這工作正常。
----------
//使用宏__declspec(DLLEXPORT)
類EXPORT_API ICustomer
{
公共:
虛擬無效PlaceOrder()= 0;
//
};
----- <在託管C++> -----
`的#include 「unmanagedlib/ICustomer.h」

//在託管的DLL中定義的非託管派生類
類LocalCustomer.h LocalCustomer:public ICustomer
{
public:
void PlaceOrder();
//
};

LocalCustomer用於Managed dll。我可以將它傳遞給非託管dll中的函數,並且它可以正常工作。

這是問題所在。 當我嘗試實現一個暴露模板的接口時,我在啓動時得到一個STATUS_INVALID_IMAGE_FORMAT。

不運行。
--------
stuct訂單
{
雙價;
// ...
};

模板<typename T>
類EXPORT_API ICollection的
{
// ....
};

類EXPORT_API器IFactory
{
公共:
虛擬ICollection的<Order> & GetOrders()= 0;
}
------ <在託管C++ DLL> -------

類OrderCollection:公共的ICollection <Order>
{
//
};

類LocalFactory:公共器IFactory
{
公共:
虛擬ICollection的<Order> & GetOrders(){返回m_orders; }
private:
OrderCollection m_orders;
};

我已經縮小了模板覆蓋GetOrders。在託管dll中的代碼會導致一個對話框打開「應用程序無法正確啓動(0xc000007b),這只是託管加載器引發的STATUS_INVALID_IMAGE_FORMAT HRESULT。刪除代碼允許它運行。那麼模板有什麼問題爲什麼我不能在託管的DLL中使用它

另一個線索,不知道這是否是一個分心..我正在編譯一個32位應用程序,並運行在Win7 x64上。只要模板沒有跨越dll從非託管到管理。

什麼殺我是我有幾個非託管的C++模板,完全生活在託管的DLL中,他們工作得很好,它只是模板之間的交叉似乎給我不好的形象的dll。

回答

2

我不確定,但在我看來,您無法從dll導出通用(模板)類。模板在構建時在代碼中引用時被實例化。這意味着模板的源代碼必須在構建時可見,但情況並非如此。你有一個預編譯的DLL,你會如何期待模板實例化?

+0

這是正確的。 .NET泛型可以在運行時暴露,但C++模板是構建時間,不能在運行時暴露。 – Puppy 2010-07-20 16:07:10

0

事實證明,解決方法是將非託管模板實現移動到他們自己的非託管實現dll中。暴露模板參數的界面可以通過h文件暴露。但我似乎無法在受管dll內部實現該模板。 所以基本上

[基礎庫公開模板DLL] - > [模板實現DLL] - > [託管C++的dll]

這一切都是好的,只要.h文件藏模板類的實現。