2009-08-12 80 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宏应用于派生类。