COM技术介绍
0x00 知识背景
在使用directx相关的技术的时候,总绕不过去一个点,COM(component object model)。那么这是个什么东东呢?
0x01 产生背景
在windows上,dll作为动态链接库,一直是导出的c语言函数,直接传递地址,然后按照对应的函数定义,直接call该地址传递对应参数即可调用。
c语言可以写dll,c++程序员也想啊!但是c++是面向对象语言,有类的概念,意味着,每个非static的函数(成员函数),实际上多传了一个this指针,指向调用的对象即下面这样
o->func() <===> func(&o)
因此,我们要调用c++写的dll的函数,我们需要来创建一个对应的对象啊。问题来了,创建对象的函数是应该由我们自己实现还是dll实现呢? 当然是dll啦,因为本来面向对象讲的就是封装,不让我们知道类的内部细节,我们怎么可能new的出来?即使我们new的出来,下次dll更新了,类定义变了,就可能产生兼容问题(对象的内存分布变了,新的函数访问里面的数据就错了)。因此c++版的dll必须能够给我们提供对象,因此就有了COM里的create方法。(工厂模式)。同样的,对象的销毁,也该由c++版的dll(com)来提供吧。
这是COM首要解决的问题,但不是COM想解决的全部问题。COM说,既然都由我来管理对象了,那销毁和创建就改成引用的增加和减少吧,靠引用数量决定是不是要真的销毁。 COM又说,要是每个c++dll作者都订立一套工厂标准,岂不是还有兼容问题,索性我来定个标准吧,都按照我的方法来,且每个类都搞一个guid标注,这样以后都好分辨。
可见COM技术主要是为了解决二进制级别的兼容性问题,新版老版一个guid就解决了。