DLL导出和虚拟方法

时间:2013-06-11 17:11:25

标签: visual-c++ abstract-class dllexport

在Windows项目中,我们定义了一个接口类

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

和工厂功能

__declspec(dllexport) Interface *construct();

在DLL中。当然,DLL中有Interface的具体专业化,但我们不会将其导出。不过我们可以在DLL之外使用它。这是如何运作的?由vftable构造的实例的construct()由针对未由DLL导出的函数的函数指针组成。这种方法是可接受的还是或多或少是黑客攻击?

1 个答案:

答案 0 :(得分:3)

没有必要导出具体类。从Interface指针获得的v表将设置为存储在DLL中的具体v表。其中已经将所有函数指针正确设置为实现方法。所以一旦你得到了v-table指针,那么你就是金色的,可以调用任何具体的方法。与COM比较,除了工厂函数(DllGetClassObject)之外,您永远不会从COM服务器导出任何内容。

必须导出construct()函数,外部代码没有任何其他方式可以获取此函数的地址。需要一个查找表,将函数名称映射到函数地址。 DLL的导出表。导出函数和类将条目添加到该导出表。