2008-09-21 54 views
13

從DLL導入C++類的正確方法是什麼?我們使用Visual C++。動態地從DLL中導入C++類

有dllexport/exports.def + LoadLibrary + GetProcAddress trifecta,但它不適用於C++類,僅適用於C函數。這是由於C++名稱 - mangling?我如何完成這項工作?

回答

2

我通常聲明一個接口基類,在我的應用程序中使用這個聲明,然後使用LoadLibrary,GetProcAddress來獲取工廠函數。該因子總是返回接口類型的指針。

這是一個實際的例子,exporting an MFC document/view from a DLL,動態加載

1

DLLEXPORT/dllimport的作品,在頭文件中的類名之前把它和你去好。

通常你想在dll中使用dllexport,在exe中使用dllimport(但是你可以在任何地方使用dllexport,它的工作原理是「正確的」使它加載速度更快)。

顯然是用於鏈接時編譯。您可以使用/ delayload鏈接器指令使其成爲「動態」,但這可能不是您想要的主題行。

如果你真的想要一個LoadLibrary樣式加載,你將不得不用「extern C」包裝來包裝你的C++函數。問題是由於名稱混亂,你可以輸入完整的名稱,它會工作。

解決方法通常是提供一個C函數,該函數返回一個指向正確類的指針 - COM以這種方式工作,因爲它從dll導出4個C函數,用於獲取dll中對象內的接口方法。

12

您需要添加以下內容:

extern "C" 
{ 
... 
} 

避免功能截斷。

你可能會考慮寫兩個簡單的C函數:

SomeClass* CreateObjectInstace() 
{ 
    return new SomeClass(); 
} 

void ReleaseObject(SomeClass* someClass) 
{ 
    delete someClass; 
} 

只用你也可以在以後添加這些功能/你的對象創建/刪除的改變功能。這有時稱爲工廠。

+1

不應該這些`SomeClass`名稱帶星號(即指向`SomeClass`的指針)嗎? – 2011-09-13 14:17:06

2

退房this question。基本上有兩種方法。您可以使用_dllexport標記該類,然後鏈接到導入庫,並且該DLL將自動加載。或者如果你想自己動態地加載DLL,你可以使用@titanae建議的工廠函數想法