2009-08-12 62 views
5

考慮到與下面的類一個DLL:__declspec(dllimport的/ DLLEXPORT)和繼承

#define DLLAPI __declspec(...) 

class DLLAPI Base 
{ 
    public: 
    virtual void B(); 
}; 

class Derived : public Base 
{ 
    public: 
    virtual void B(); 
    virtual void D(); 
}; 

請問我的「派生」類中的dll的外部可見即使「DLLAPI」關鍵字不會應用到類定義(至少,不是直接)?

「D()」函數是否可見?

感謝

回答

4

類Derived不會被您的DLL導出。類不會繼承導出。添加DLLAPI也是如此。

請注意,類成員默認爲私有可訪問性,所以您的方法都不應該可訪問。但是,我確實在我的測試中看到了Base :: B()被導出。在使用DLL的代碼中的C++頭文件會標記錯誤,但我想知道你是否在頭部調整了頭部,如果你可以欺騙它。

無論如何,如果你沒有實例化DLL中派生的(通過另一個入口點),虛擬表應該仍然可以工作,所以如果你做的事:

Base* b = getTheDerived(); b->B(); 

你調用派生:: B( )。

3

您可以從Visual Studio命令外殼找出通過鍵入

link /dump /exports <yourdll> 

如果他們出口,你會看到「修飾的名」的職能。若要查看它們的可讀格式,請複製並粘貼一個,然後執行

undname <decorated name> 
1

否,派生將不會在DLL外部可見。爲了導出派生類,您也必須將DLLAPI宏應用於派生類。