2009-02-22 155 views
3

如何從dll公開課程?從C++ dll暴露類?

應用程序導入DLL應該能夠創建該類的對象,也他應該能夠調用到類的成員函數。

與使用_declspec(dllexport)公開C類型函數是否相似?

並且當我建立的DLL(僅包含在頭文件中,並在CPP文件及其成員函數定義的類定義),則不創建對應庫文件。

回答

1

與使用_declspec(dllexport)公開C型功能相似嗎?

是的。而__declspec可以應用於該類。

沒有相應的庫文件被創建

IIRC這是默認的,但你可以覆蓋默認的連接選項。

2

Here。請記住,您不能使用LoadLibrary()/ GetProcAddress()來使用此導出的類。

0

谷歌搜索「class dllexport」導致this page from MSDN作爲第一個結果。

的頁面似乎表明僅僅有__declspec(dllexport)是所有你需要做的。

2

在導出類中至少一個公共方法的定義必須具有_declspec(dllexport)的前綴被創建庫文件。如果沒有任何方法具有此前綴,則只有聲明(即頭文件)可用,但該類將無法實例化(導出的構造函數對此是必需的)。如果至少有一個方法有_declspec(dllexport)前綴,那麼編譯器會明白dll用戶必須能夠鏈接到這個dll。操作系統加載這樣的DLL,只要連接到它們的exe被加載。

您可能會考慮針對您的問題的「工廠」方法。例如,Symbian操作系統採用多態DLL實現了這種方法。要做到這一點,你必須:

  1. 聲明(即頭文件)和定義(即cpp文件)在你的dll類。無需其他任何東西。

  2. 創建您的DLL「工廠」的功能,這將使一個實例類,並返回指針。該函數必須具有_declspec(dllexport)前綴。

  3. 與你的用戶分享你的頭文件和lib文件。

  4. 用戶包含頭文件並鏈接到lib文件。

  5. 用戶調用工廠功能實例化的類(即使對象),然後用它作爲普通的類。

以上5個步驟在Symbian操作系統中就像魅力一樣。你將不得不在自己的平臺上嘗試它併發布結果。坦率地說,我沒有在Windows上嘗試過。

+1

事實上,我們可以將整個類聲明爲_declspec(dllexport),它允許類被實例化,並且允許調用成員函數。 (如上面答案中的鏈接所示)。 – 2009-02-22 14:42:18