2013-06-11 22 views
1

在Windows項目中,我們定義一個接口類DLL導出和虛擬方法

class Interface { 
public: 
    virtual ~Interface() { } 
    virtual void func() = 0; 
}; 

和工廠功能

__declspec(dllexport) Interface *construct(); 

一個DLL裏面。當然在DLL裏面有一個具體的Interface,但是我們不會導出它。不過,我們可以在DLL之外使用它。這個怎麼用?由construct()構造的實例的vftable由函數指針組成,函數指針指向不由DLL導出的函數。這種方法是可以接受的還是或多或少的黑客行爲?

回答

3

只是沒有任何需要導出具體的類。從接口指針獲得的v表將被設置爲DLL中存儲的具體v表。其中已經有所有的函數指針正確地設置爲實現方法。所以一旦你得到了v-表指針,那麼你就是金,可以調用任何具體的方法。與COM相比,除了工廠函數(DllGetClassObject)外,您絕不會從COM服務器導出任何內容。

必須導出construct()函數,沒有任何其他方式可以獲得外部代碼的這個函數的地址。需要查找表將函數名稱映射到函數地址。 DLL的導出表。導出函數和類將條目添加到該導出表。

+0

所以,如果COM永遠不會出口除工廠功能以外的任何東西,它必須是一個被廣泛接受的技術。 – phlipsy

+0

而V表的佈局來自公共可用的標題,它定義了「接口」? – phlipsy

+0

是的,粗略地說,是編譯器根據接口的聲明來構建它。一個相當臭名昭着的DLL地獄的來源btw,版本化是困難的。客戶端使用接口的新聲明並意外加載舊版本的DLL會嚴重崩潰。 COM要求您在更改界面時始終更改界面IID的核心原因。 –