本文算是对《COM技术内幕》前七章内容的一些总结,当然还有一些疑惑之处,也留作探讨。
(一)COM的注册
按照COM库的实现,注册方式有:
(1)In-process DllRegisterServer DllUnRegisterServer
(2)out-process 组件必须实现命令 /regserver /unregserver 或者 -regserver -unregserver
上面所说都是自注册组件,如果是非自注册组件,那么必须写专门的程序来实现。
(二)COM的创建
这里所说的COM创建是建立在COM库基础之上的。
本来画图是最好的表达方式,不过时间紧急,留待以后补全。
不与类厂打交道的话,直接CallCreateInstance()就可以了,组件提供CreateInstance()实现;
与类厂打交道,也有两种方式供选择:
(1)::CoCreateInstance() 在CoCreateInstance的实现中已经调用了::CoGetClassObject,在CoGetClassObject中也调用了DllGetClassObject
(2)::CoGetClassObject() 剩下的流程与上面的一样,只是可以按照自己的需求创建类型,比如用IFactoryClass2代替IFactoryClass1等
大家需要结合com库中CoCreateInstance的实现来理解上面的话。
大多数情况下选择(1)就可以了,只有在两种情况下需要选择(2)——
当程序员需要控制创建类厂的方式的时候,比如用IFactoryClass2代替IFactoryClass;
当需要创建一个组件的多个实例的时候,只需要创建类厂一次,而(1)必须为每个实例创建和销毁类厂,造成资源的浪费。
(三)类厂
虽然类厂已经写入COM库,最开始我还是不知道为什么要这么做?那么引入类厂的意义到底在哪里?
下面我们一起来看看。
一个组件对应一个类厂。
对于书本上的哪些解析我基本上没有看懂,只能讲讲自己的理解,如果不对之处,还请不吝赐教,帮我提高进步。
在C++和JAVA中存在工厂模式(当然我不知道类厂的概念是否也源于此),目的是将对象的创造抽离出来,在运行时根据传入的类的型别来决定创建哪个类的对象,能够达到更好地封装细节的效果。
在这里,我觉得这个解释同样适用。
可以在DllGetClassObject中根据CLSID来判断创建哪个类厂的对象。