给定一个具有以下类的DLL:
#define DLLAPI __declspec(...) class DLLAPI Base { public: virtual void B(); }; class Derived : public Base { public: virtual void B(); virtual void D(); };
即使“DLLAPI”关键字不适用于类定义(至less不是直接),我的“Derived”类是否可以在dll外部可见?
“D()”函数是否可见?
谢谢
Derived类不会被你的DLL导出。 类不会继承导出。 添加DLLAPI也是如此。
还要注意,类成员默认为私有可访问性,所以你的方法都不应该是可访问的。 但是,我确实在我的测试中看到Base :: B()被导出。 在使用DLL的代码中的C ++标题会标记错误,但是我想知道是否在那里调整了标题,如果你可以欺骗它。
无论如何,如果你实例化了一个派生的DLL(通过另一个入口点),虚拟表仍然可以工作,所以如果你这样做:
Base* b = getTheDerived(); b->B();
你会调用Derived :: B()。
您可以通过键入从Visual Studio命令行程序中找到
link /dump /exports <yourdll>
如果他们出口,你会看到“装饰名称”的功能。 要查看它们以可读格式进行操作,请复制并粘贴一个
undname <decorated name>
不,Derived在DLL之外是不可见的。 为了导出派生类,您也必须将DLLAPI宏应用于派生类。
你必须使基类和派生类都是可导出的,
http://msdn.microsoft.com/en-us/library/81h27t8c.aspx
All base classes of an exportable class must be exportable. If not, a compiler warning is generated.