phl*_*psy 2 abstract-class dllexport visual-c++
在Windows项目中我们定义一个接口类
class Interface {
public:
virtual ~Interface() { }
virtual void func() = 0;
};
Run Code Online (Sandbox Code Playgroud)
和一个工厂函数
__declspec(dllexport) Interface *construct();
Run Code Online (Sandbox Code Playgroud)
在 DLL 内。Interface当然,DLL 内部有具体的专门化,但我们不导出它。不过我们可以在 DLL 之外使用它。这是如何运作的?vftable由 构造的实例由construct()指向 DLL 未导出的函数的函数指针组成。这种方法可以接受还是或多或少是一种黑客行为?
只是不需要导出具体的类。从接口指针获得的 v 表将被设置为存储在 DLL 内的具体 v 表。其中已经将所有函数指针正确设置为实现方法。因此,一旦获得了 v 表指针,您就可以调用任何具体方法了。与 COM 相比,除了工厂函数 (DllGetClassObject) 之外,您无需从 COM 服务器导出任何内容。
您必须导出 construct() 函数,外部代码没有任何其他方法可以获取该函数的地址。需要一个将函数名称映射到函数地址的查找表。DLL 的导出表。导出函数和类会将条目添加到该导出表中。