给定具有以下类的DLL:
#define DLLAPI __declspec(...)
class DLLAPI Base
{
public:
virtual void B();
};
class Derived : public Base
{
public:
virtual void B();
virtual void D();
};
即使“DLLAPI”关键字未应用于类定义(至少不是直接),我的“Derived”类是否可以在dll之外显示?
“D()”功能是否可见?
由于
答案 0 :(得分:4)
类Derived。类不继承导出。同时添加DLLAPI。
另请注意,类成员默认使用私有辅助功能,因此无法访问任何方法。但是,我确实看到Base :: B()在我的测试中被导出。使用DLL的代码中的C ++标题会标记错误,但我想知道你是否在那里调整了标题,如果你可以欺骗它。
无论如何,如果你在你的DLL中实例化了一个Derived(通过另一个入口点),那么虚拟表应该仍然有用,所以如果你这样做了:
Base* b = getTheDerived(); b->B();
你要调用Derived :: B()。
答案 1 :(得分:3)
您可以通过键入
从Visual Studio命令shell中找到link /dump /exports <yourdll>
如果导出它们,您将看到函数的“装饰名称”。要查看它们的人类可读格式,请复制粘贴一个并执行
undname <decorated name>
答案 2 :(得分:1)
不,Derived在DLL外部不可见。为了导出派生类,您还必须将DLLAPI宏应用于派生类。
答案 3 :(得分:0)
您必须使基类和派生类都可导出,
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.