1

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

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

和工厂功能

__declspec(dllexport) Interface *construct();

在一个DLL中。当然Interface,DLL 内部有一个具体的专门化,但我们不导出它。不过,我们可以在 DLL 之外使用它。这是如何运作的?由 构造的vftable实例construct()由函数指针组成,这些指针指向 DLL 未导出的函数。这种方法是可以接受的还是或多或少是一种黑客行为?

4

1 回答 1

4

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

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

于 2013-06-11T17:41:23.640 回答