1
在Windows项目中,我们定义一个接口类DLL导出和虚拟方法
class Interface {
public:
virtual ~Interface() { }
virtual void func() = 0;
};
和工厂功能
__declspec(dllexport) Interface *construct();
一个DLL里面。当然在DLL里面有一个具体的Interface
,但是我们不会导出它。不过,我们可以在DLL之外使用它。这个怎么用?由construct()
构造的实例的vftable
由函数指针组成,函数指针指向不由DLL导出的函数。这种方法是可以接受的还是或多或少的黑客行为?
所以,如果COM永远不会出口除工厂功能以外的任何东西,它必须是一个被广泛接受的技术。 – phlipsy
而V表的布局来自公共可用的标题,它定义了“接口”? – phlipsy
是的,粗略地说,是编译器根据接口的声明来构建它。一个相当臭名昭着的DLL地狱的来源btw,版本化是困难的。客户端使用接口的新声明并意外加载旧版本的DLL会严重崩溃。 COM要求您在更改界面时始终更改界面IID的核心原因。 –