cOM特性 潘爱民 http:/www.icst.pku.edu.cn/compcourse
COM特性 潘爱民 http://www. http://www.icst.pku.edu.cn/compcourse compcourse
复习:对象创建过程 DllGetClassobject 创建类厂对象 客户 创建实例对象
复习:对象创建过程 复习:对象创建过程 客户 组件 创建实例对象 DllGetClassObject { } 创建类厂对象
复习: Treeview组件的注册信息 t口0em38n3-187-1c-0-0C074A08} W713E2-850k-101BAFC-4210102A0DA7 Microsoft tree view control 口 Control t-0 Implemented categories InprocServer 32 C: WINDOWSISYSTEMCOMCTL32 OCX t口 MiscStatus COMCTL TreeCtrl 1 口 Programmable 口 ToolboxBi tmap32 6B7E6392-850A-101B-AFC0-4210102A8DA7} a versionIndependentProgID 白口0713E8A8-8504-1013-AFC0-42101028A7} 口 Inprocserver32 C: WINDOWSISYSTEMCOMCTL32 OCX 中口0713E8n2-850A-101B-AC0-4210102A87} 中口0713E88-8504-101-AFC0-42101028A7}
复习:TreeView TreeView组件的注册信息 组件的注册信息 Microsoft TreeView Control C:\WINDOWS\SYSTEM\COMCTL32.OCX COMCTL.TreeCtrl.1 {6B7E6392-850A-101B-AFC0-4210102A8DA7} C:\WINDOWS\SYSTEM\COMCTL32.OCX
复习:类厂( Class Factory 类厂:用于创建CO对象的COM对象 目标:元成COM对象的创建过程,更好 地把客户与对象隔离开来。 特殊性 实现一个或多个创建接口,缺省的接口 为 , IClassFactor 类厂本身没有 CLSID 但是类厂的引用计数不参与对组件生命周期 的控制,如果需要,可以使用锁计数功能
复习:类厂(Class Factory) Class Factory) !类厂:用于创建 类厂:用于创建COM对象的COM对象 !目标:完成COM对象的创建过程,更好 对象的创建过程,更好 地把客户与对象隔离开来。 地把客户与对象隔离开来。 !特殊性: – 实现一个或多个创建接口,缺省的接口 实现一个或多个创建接口,缺省的接口 为IClassFactory IClassFactory – 类厂本身没有CLSID – 但是类厂的引用计数不参与对组件生命周期 但是类厂的引用计数不参与对组件生命周期 的控制,如果需要,可以使用锁计数功能 的控制,如果需要,可以使用锁计数功能
复习:类(续) 类厂与CM对象有一一对应关系 字典组件 多对象、多类厂组件 类厂1 类厂2 IClassFactory IDictionary 字典对象 对象1 对象2 SPellcHeck
复习:类厂(续) !类厂与COM对象有一一对应关系 对象有一一对应关系 字典组件 IClassFactory 类厂 字典对象 IDictionary ISpellCheck 多对象、多类厂组件 类厂 1 对象 1 类厂 2 对象 2
复习:c0M创建函数 CoGetClassobject Cocreateinstance e CocreatelnstanceEx 冷注意:对于DL组件,创建函 数调用D| GetClassobject引出 函数创建类厂,再由类厂创建 COM对象
复习:COM创建函数 !CoGetClassObject CoGetClassObject !CoCreateInstance CoCreateInstance !CoCreateInstanceEx CoCreateInstanceEx !注意:对于DLL组件,创建函 数调用DllGetClassObject DllGetClassObject引出 函数创建类厂,再由类厂创建 函数创建类厂,再由类厂创建 COM对象
复习:C0M库 CO库的初始化 COM库的内存管理 冷组件程序的装载和卸载 冷常用函数和 HRESULT GUD管理 创建函数 初始化函数 内存管理函数 字符串使用 OLECHAR类型
复习:COM库 !COM库的初始化 !COM库的内存管理 !组件程序的装载和卸载 组件程序的装载和卸载 !常用函数和HRESULT HRESULT – GUID管理 – 创建函数 – 初始化函数 – 内存管理函数 – 字符串使用OLECHAR OLECHAR类型
复习:实现一个进程内C0M组件的步骤 少定义必要的CLSD和ID 少实现COM对象 通过 QueryInterface暴露其接口 一管理引用计数,注意对全局引用计数的维护 实现类厂对象 对象的引用计数不记在全局对象引用计数内 维护锁计数 冷实现D| Getclassobject、D‖ CanUnloadnow (可选)实现两个注册函数
复习:实现一个进程内 复习:实现一个进程内COM组件的步骤 !定义必要的CLSID 和IID !实现COM对象 – 通过QueryInterface QueryInterface暴露其接口 – 管理引用计数,注意对全局引用计数的维护 管理引用计数,注意对全局引用计数的维护 !实现类厂对象 – 对象的引用计数不记在全局对象引用计数内 对象的引用计数不记在全局对象引用计数内 – 维护锁计数 !实现DllGetClassObject DllGetClassObject 、DllCanUnloadNow DllCanUnloadNow ! (可选 )实现两个注册函数 实现两个注册函数
可重用性( reuse,复用) 重用性:当一个程序单元能够对其他的程序单元提 供功能服务时,尽可能地重用原先程序单元的代码, 既可以在源代码一级重用,也可以在可执行代码一级 重用。 冫COM重用性:因为M是建立在二进制代码基础 上的标准,所以其重用性也必然建立于二进制代码上。 COM重用模型:包容和聚合 ☆真正的重用:是实现重用而不是代码重用
可重用性(reuse,复用) !重用性:当一个程序单元能够对其他的程序单元提 当一个程序单元能够对其他的程序单元提 供功能服务时,尽可能地重用原先程序单元的代码, 供功能服务时,尽可能地重用原先程序单元的代码, 既可以在源代码一级重用,也可以在可执行代码一级 既可以在源代码一级重用,也可以在可执行代码一级 重用。 !COM重用性:因为COM是建立在二进制代码基础 是建立在二进制代码基础 上的标准,所以其重用性也必然建立于二进制代码上。 上的标准,所以其重用性也必然建立于二进制代码上。 !COM重用模型:包容和聚合 重用模型:包容和聚合 !真正的重用:是实现重用而不是代码重用 是实现重用而不是代码重用