文档介绍:特性特性潘爱民潘爱民 http://www. http://www. icst icst . . pku pku . . edu edu . . / / pCourse 内容内容??复****复****实现实现?? 可重用模型可重用模型√√?? 跨进程模型跨进程模型√√?? 线程模型线程模型?? 安全性安全性复****对象创建过程复****对象创建过程客户组件创建实例对象 DllGetClassObject {} 创建类厂对象复****复****TreeView TreeView 组件的注册信息组件的注册信息 Microsoft TreeView Control C:\WINDOWS\ {6B7E6392-850A-101B-AFC0-4210102A8DA7} C:\WINDOWS\ 复****类厂复****类厂( ( Class Factory) Class Factory) ??类厂:用于创建类厂: COM 对象的 COM 对象对象??目标:完成目标: COM 对象的创建过程,更好对象的创建过程,更好地把客户与对象隔离开来。地把客户与对象隔离开来。??特殊性: 特殊性: ––实现一个或多个创建接口,缺省的接口为实现一个或多个创建接口,缺省的接口为 IClassFactory IClassFactory ––类厂本身没有类厂本身没有 CLSID CLSID ––但是类厂的引用计数不参与对组件生命周期但是类厂的引用计数不参与对组件生命周期的控制,如果需要,可以使用锁计数功能的控制,如果需要,可以使用锁计数功能复****类厂复****类厂( (续续) ) ??类厂与 COM 对象有一一对应关系对象有一一对应关系字典组件 IClassFactory 类厂字典对象 IDictionary ISpellCheck 多对象、多类厂组件类厂 1对象 1 类厂 2对象 2复****复****创建函数创建函数?? CoGetClassObject CoGetClassObject ?? CoCreateInstance CoCreateInstance ?? CoCreateInstanceEx CoCreateInstanceEx ??注意:对于注意:对于 DLL DLL 组件,创建函组件,创建函数调用数调用 DllGetClassObject DllGetClassObject 引出引出函数创建类厂,再由类厂创建函数创建类厂, COM 对象对象复****复****库库?? 库的初始化库的初始化?? 库的内存管理库的内存管理??组件程序的装载和卸载组件程序的装载和卸载??常用函数和常用函数和 HRESULT HRESULT –– GUID GUID 管理管理––创建函数创建函数––初始化函数初始化函数––内存管理函数内存管理函数––字符串使用字符串使用 OLECHAR OLECHAR 类型类型复****实现一个进程内复****COM 组件的步骤组件的步骤??定义必要的定义必要的 CLSID CLSID 和和 IID IID ??实现 COM 对象对象––通过通过 QueryInterface QueryInterface 暴露其接口暴露其接口––管理引用计数,注意对全局引用计数的维护管理引用计数,注意对全局引用计数的维护??实现类厂对象实现类厂对象––对象的引用计数不记在全局对象引用计数内对象的引用计数不记在全局对象引用计数内––维护锁计数维护锁计数??实现实现 DllGetClassObject DllGetClassObject 、、 DllCanUnloadNow DllCanUnloadNow ??( (可选可选) )实现两个注册函数实现两个注册函数可重用性( 可重用性( reuse reuse , ,复用) 复用) ??重用性: 重用性: 当一个程序单元能够对其他的程序单元提当一个程序单元能够对其他的程序单元提供功能服务时,尽可能地重用原先程序单元的代码, 供功能服务时,尽可能地重用原先程序单元的代码, 既可以在源代码一级重用,也可以在可执行代码一级既可以在源代码一级重用,也可以在可执行代码一级重用。重用。?? 重用性: 重用性: 因为 COM 是建立在二进制代码基础是建立在二进制代码基础上的标准,所以其重用性也必然建立于二进制代码上。上的标准,所以其重用性也必然建立于二进制代码上。?? 重用模型:包容和聚合重用模型:包容和聚合??真正的重用: 真正的重用: 是实现重用而不是代码重用是实现重用而不是代码重用