COM学习:创建、注册与类厂

本文算是对《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来判断创建哪个类厂的对象。

                

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值