第7章 类厂

 
第7章 类厂

1、类厂实际上就是一个带有能够创建其他组件的组件。

引入类厂的原因是CoCreateInstance函数的局限性:CocreateInstance创建组件的过程是,传递给它一个CLSID,然后它创建相应的组件,并返回指向所请求的接口的指针。大所数情况下,CoCreateInstance确实是可以完成它的工作的。但CoCreateInstance却没有给客户提供一种能够控制组件创建过程的方法。当CoCreateInstance完成之后,组件实际上已经建立好了。在建立好一个组件后,想要控制将组件装载到内存中何处或检查客户是否有权限来创建该组件基本上已经不可能了。解决这个问题的方法就是使用另外一个专门用于创建所需组件的组件,这个组件就是类厂。

2、某个特定的类厂将创建只同某个特定的CLSID相应的组件。客户可以通过类厂所支持的接口来对类厂创建组件的过程加以控制。

3、创建组件的标准接口是IClassFactory,用CoCreateInstance创建的组件实际上是通过IClassFactory创建的。

4、 CoCreateInstance与CoGetClassObject: CoCreateInstance实际上是通过CoGetClassObject实现的。

5、为什么要使用CoGetClassObject?

(1)若想用不同于IClassFactory的某个创建接口来创建组件,则必须使用CoGetClassObject。比如像使用IClassFactory2来创建组件,就需要使用CoGetClassObject。

(2)若需创建同一组件的多个实例,那么使用CoGetClassObject将可以获得更高的效率。因为这样只需创建相应的类厂一次,而CoCreateInstance则需为每一个实例分别创建并释放相应的类厂。

(3)另外CoGetClassObject使得客户可以对组件的创建过程进行更多的控制。

6、使用COM库函数和类厂创建组件的过程:

首先是客户,它将通过调用CoGetClassObject来启动组件的创建过程。其实是COM库,它实现了CoGetClassObject函数。第三个角色是DLL,其中实现了被CoGetClassObject调用的DllGetClassObject函数。DllGetClassObject的任务就是创建客户所请求的类厂。

(1)客户调用COM库函数CoCreateInstance,CoCreateInstance调用COM库函数CoGetClassObject;

(2)COM库根据注册表找到DLL并将DLL装入进程;

(3)CoGetClassObject调用DllGetClsasObject;

(4)DllGetClsasObject创建类厂;

(5)DllGetClassObject函数把类厂接口指针返回给CoGetClassObject函数;

(6)CoGetClassObject函数把类厂接口指针返回给CoCreateInstance函数;

(7)CoCreateInstance函数得到类厂后,调用类厂的对象创建函数;

(8)类厂创建COM对象;

(9)类厂把COM对象返回给CoCreateInstance函数,CoCreateInstance返回;

(10)客户直接调用COM对象。

7、DLL的卸载:LockServer、DllCanUnloadNow、

8、COM库中常用函数:

(a)初始化函数:

CoBuildVersion:获取COM库的版本号

CoUnitialize:COM库的初始化

CoUninitialize:COM库功能服务终止

CoFreeUnusedLibraries:释放进程中所有不再使用的组件程序

(b)GUID有关函数:

IsEqualGUID:判断两个GUID是否相等

IsEqualIID:判断两个IID是否相等

IsEqualCLSID:判断两个CLSID是否相等

CLSIDFromProgID:把字符串形式的对象标识转化为CLSID结构形式

StringFromCLSID:把CLSID结构形式转化为字符串形式

IIDFromString:把字符串形式的IID转化为IID结构形式

StringFromIID把IID结构形式转化为字符串形式

StringFromGUID2:把GUID结构形式转化为字符串形式

(c)对象创建函数:

CoGetClassObject:获取对象的类厂

CoCreateInstance:创建COM对象

CoCreateInstanceEx:创建COM对象,可指定多个接口或远程对象

CoRegisterClassObject:登记一个对象,以便其他应用可以连接到该对象

CoRevorkClassObject:取消对象的登记操作

CoDisconnectObject:断开其他应用与对象的连接

(d)内存管理函数:

CoTaskMemAlloc:内存分配函数

CoTaskMemRealloc:内存重新分配函数

CoTaskMemFree:内存释放函数

CoGetMalloc:获取COM库的内存管理接口

9、类厂的示例实现代码:CSDN我的资源中InsideCOM\CHAP07XXX

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值