已阅读5页,还剩73页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
COM实现 潘爱民 内容 复习 COM接口与COM对象注册表类厂COM库总结和例子 组件接口 第一个里程碑用vtable作为接口解决了名字冲突和二进制结构兼容问题第二个里程碑接口转换 Dynamic cast第三个里程碑管理对象生命周期 引用计数 COM接口 接口标识 IIDIUnknown接口 classIUnknown public virtualHRESULT stdcallQueryInterface constIID COM接口结构 COM接口引用计数 引用计数的含义Outstandingreference对象实现引用计数AddRef Release客户显式地操纵引用计数客户有责任维护好引用计数引用计数规则 COM接口QueryInterface HRESULT stdcallQueryInterface constIID iid void ppv 一个COM对象可以实现多个接口QueryInterface是技术保证QueryInterface实现多继承情况 使用static cast向上转换对象身份 IUnknown必须唯一客户通过QueryInterface使用对象的接口注意 QueryInterface内含AddRef COM对象的标识 CLSID 是GUID的一种用法创建对象的时候必须要提供CLSIDCOM对象的身份身份是否一致的可判断性 COM对象与C 对象的比较 层次差异封装特性可重用性多态性的表现形式不同 COM对象和接口图示 COM对象 客户的交互实体包括属性和方法 或者状态和操作能够提供服务 通过COM接口对象的实现由组件完全包装起来 接口描述语言 IDL interfaceIDictionary IUnknown HRESULTInitialize HRESULTLoadLibrary in string HRESULTInsertWord in string in string HRESULTDeleteWord in string HRESULTLookupWord in string out string HRESULTRestoreLibrary in string HRESULTFreeLibrary MIDL可以由IDL文件生成C C 接口描述 IDL简介 以OSFIDL为基础基本数据类型与C语言非常接近 包括结构 联合 枚举 typedef等interfacecoclasslibrary可以产生类型库 IUnknown接口的IDL描述 IDL接口定义 local object uuid 00000000 0000 0000 C000 000000000046 pointer default unique interfaceIUnknown typedef unique IUnknown LPUNKNOWN HRESULTQueryInterface in REFIIDriid out iid is riid void ppvObject ULONGAddRef ULONGRelease IDL中类的描述 uuid 1e196b20 1f3c 1069 996b 00dd010fe676 version 1 0 helpstring Aclass helpcontext 2481 appobject coclassmyapp source interfaceIMydocfuncs IUnknown dispinterfaceDMydocfuncs IDL中库的描述 uuid 12345678 1234 1234 1234 123456789ABC helpstring Hello2 0TypeLibrary lcid 0 x0409 version 2 0 libraryHello Librarydefinitionstatements IDL中library示例 object uuid interfaceIKnown IUnknown import unknwn idl libraryKnownLibrary referenceinterfaceIKnown interfaceIKnown orcreateanewclass coclassKnowMore interfaceIKnown IDL的意义 IDL语言无关跨语言的中间语言MIDL exe产生C 头文件定义相当于C 定义MIDL exe产生TLB类型库COM本身提供了一套基础设施来解释类型库所有的标准接口都可以在SDK中找到IDL描述 编译IDL xxx IDL文件 MIDL exe xxx hC 头文件 xxx i cGUID xxx p cP S dlldata c xxx tlb 用于客户 服务器 proxy stub 用于其他编程语言 如Java VB COM对象实现形式 进程内组件inprocesscomponent进程外组件outofprocesscomponent 进程内组件 组件 做成DLL 引出函数客户 用到的API函数 LoadLibrary GetProcAddress FreeLibrary说明 1 也可以引出全局变量2 DumpBin检查组件的引出函数和变量 进程外组件 实现形式 EXEIPC DDE 消息机制 共享内存 RPC LPC等等例 应用调用系统服务 进程外组件 续 回顾 对象与客户之间的连接 客户通过vtable与对象进行通信客户如何获得第一个接口指针 CreateString引出函数如何创建 create 激活 activate 创建工作一定是由组件中的一个函数来完成 创建函数CreateObject客户如何访问这个函数 创建函数 方案1直接引出创建函数优点 对于DLL非常方便方案2把创建函数封装到一个对象中 通过vtable调用优点 灵活 客户以一致的方式调用创建函数 创建函数 续 创建函数所在的对象 该对象被称为类对象 也称为类厂现在问题是 如何创建类厂对象 对于DLL通过引出函数对于EXE EXE的引出函数 客户 引出函数 类厂对象 用户对象引出函数的名字固定 DllGetClassObject增加了一层间接性 带来灵活性 创建对象结构示意图 客户 组件 创建实例对象 DllGetClassObject 创建类厂对象 类厂 ClassFactory 类厂 用于创建COM对象的COM对象目标 完成COM对象的创建过程 更好地把客户与对象隔离开来 特殊性 实现一个或多个创建接口 缺省的接口为IClassFactory类厂本身没有CLSID 类厂 续 类厂与COM对象有一一对应关系 创建类厂对象 DllGetClassObject创建类厂对象创建类厂对象需要哪些信息 DllGetClassObject原型 HRESULTDllGetClassObject constCLSID 创建函数需要哪些信息 clsid与类厂绑在一起iid客户提供结果接口指针类型取决于iid IClassFactory接口 classIClassFactory publicIUnknown virtualHRESULT stdcallCreateInstance IUnknown pUnknownOuter constIID 小结 客户创建对象过程 客户提供信息组件位置 clsid iid 结果接口指针地址ppv过程 根据组件位置 LoadLibraryGetProcAddress 获取DllGetClassObject用clsid和IID IClassFactory获得类厂对象接口指针pFactory用iid ppv调用pFactory CreateInstance 创建过程的位置透明性 位置透明性可以极大地方便客户程序如何做到位置透明性 在当前环境下 每个clsid必定与某个组件相联系如何从clsid映射到组件位置 解决方案 维护clsid与组件位置的映射关系在客户与组件之间插入中介 COM方案 在Windows平台上 使用系统注册表保存映射关系 所以 从clsid可以找到对应组件的位置在客户与组件之间插入COM库 由COM库完成创建的细节工作 Windows系统注册表 树状结构根是 MyComputer 预定义的5个子节点HKEY CLASSES ROOT为HKEY LOCAL MACHINE的一个子节点HKEY CURRENT USER为HKEY USERS的一个子节点HKEY LOCAL MACHINEHKEY USERSHKEY CURRENT CONFIG 通过注册表管理COM对象 HKEY CLASSES ROOT CLSID TreeView组件的注册信息 回顾 COM对象的标识 CLSID 两种形式128位整数 随机数 不需要运算功能 但是需要比较和查找功能字符串形式例如 72d3edc2 a4c4 11d0 8533 00c04fd8d503 ProgID 友好名 字符串形式有可能重名 用一种约定来避免重名例如 Word Document包含版本 Word Document 8 TreeControl的ProgID信息 注册表其他事项 系统全局的注册信息 公共信息仓库工具RegEdit exe Regedt32 OLEView程序访问途径 Win32APIComponentCategories 组件类别 组件类别 COM组件的注册 进程内组件两个引出函数DllRegisterServer和DllUnregisterServer注册工具 RegSvr32 exe例如 RegSvr32c DictComp DictComp dllRegSvr32 uc DictComp DictComp dll进程外组件命令行参数 RegServer和 UnregServer COM库 创建过程COM库处于COM组件和客户中间调用过程对于进程内组件 COM库不再参与处理 COM对象创建过程 COM创建函数 COM库中三个用于创建组件的函数 CoGetClassObjectCoCreateInstanceCoCreateInstanceEx CoGetClassObject 创建一个类厂HRESULTCoGetClassObject constCLSID CoCreateInstance HRESULTCoCreateInstance constCLSID CoCreateInstance实现伪码 HRESULTCoCreateInstance constCLSID CoCreateInstanceEx HRESULTCoCreateInstanceEx constCLSID 三个创建函数选用原则 如果客户创建远程对象或者希望一次获取对象的多个接口指针 则选用CoCreateInstanceEx函数 如果客户希望获取类厂对象或者要调用类厂的某些成员函数 则选用CoGetClassObject函数 在其他情况下 使用CoCreateInstance函数创建对象 这是最常用的方法 创建过程示意图 类厂的实现 classCDictionaryFactory publicIClassFactory protected ULONGm Ref public CDictionaryFactory void CDictionaryFactory void IUnknownmembersHRESULTQueryInterface constIID CreateInstance函数的实现 HRESULTCDictionaryFactory CreateInstance IUnknown pUnknownOuter constIID 待续 CreateInstance函数的实现 续 续上页 Obtainthefirstinterfacepointer whichdoesanAddRef hr pObj QueryInterface iid ppv if hr S OK g DictionaryNumber deletepObj returnhr DllGetClassObject的实现 extern C HRESULT stdcallDllGetClassObject constCLSID 类厂对组件生存期的控制 组件引用计数不计类厂IClassFactory LockServer函数 COM库 COM库的初始化COM库的内存管理组件程序的装载和卸载常用函数和HRESULT COM库的组成 用于创建过程的SCM ServiceControlManager rpcss exeole32 dll其他提供COM环境管理server 组件等 COM库的组成 续 COM应用 COMclient ServiceControlManagerRPCSS EXE COM应用 COMserver OLE32 DLL OLE32 DLL COM库的初始化 基本的初始化函数 HRESULTCoInitialize void pReserved 初始化之前唯一可以调用的函数 DWORDCoBuildVersion 另一个初始化函数 CoInitializeExCOM库的终止函数 voidCoUninitialize void 有关CLSID和ProgID的COM函数 IsEqualGUID IsEqualIID IsEqualCLSIDCLSIDFromProgID ProgIDFromCLSIDStringFromCLSID CLSIDFromStringStringFromIID IIDFromStringStringFromGUID2内存由调用者分配注意 COM库函数的字符串使用OLECHAR类型 COM库的内存管理 COM库提供了内存管理器以及内存管理器的标准HRESULTCoGetMalloc DWORDdwMemContext IMalloc ppMalloc classIMalloc publicIUnknown void Alloc ULONGcb 0 void Realloc void pv ULONGcb 0 voidFree void pv 0 ULONGGetSize void pv 0 intDidAlloc void pv 0 voidHeapMinimize 0 COM库内存管理用法 一 DWORDlength MAX LENGTH IMalloc pIMalloc HRESULThr hr CoGetMalloc MEMCTX TASK COM库内存管理用法 二 三个封装函数 void CoTaskMemAlloc ULONGcb voidCoTaskMemFree void pv voidCoTaskMemRealloc void pv ULONGcb COM库内存管理用法 三 DWORDlength MAX LENGTH IMalloc pIMalloc HRESULThr psz CoTaskMemAlloc length if NULL psz returnfailure pszText psz COM库内存管理用法 四 WCHAR pwProgID charpszProgID 128 hResult ProgIDFromCLSID CLSID Dictionary 组件程序的装载和卸载 进程内组件的装载DllGetClassObject进程外组件的装载 Embedding 命令行参数进程内组件的卸载CoFreeUnusedLibraries进程外组件的卸载main或者WinMain函数退出 进程内组件的卸载 组件不能自己卸载客户调用COM库函数CoFreeUnusedLibrariesCOM库调用DLL组件的引出函数HRESULTDllCanUnloadNow 若DllCanUnloadNow返回S OK 则同意卸载若DllCanUnloadNow返回S FALSE 则不同意卸载DllCanUnloadNow实现 对象计数 锁计数 COM库中一些常用函数 初始化函数GUID有关的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年透明包装材料研发项目可行性研究报告及总结分析
- 2024年重庆市从村(社区)干部中录用公务员考试真题
- 薄板CMT焊接工艺研究
- 2025年企业系统集成服务合同协议
- 2025年线上虚拟现实平台开发可行性研究报告及总结分析
- 2020-2025年中级注册安全工程师之安全生产技术基础题库综合试卷A卷附答案
- 2025年湖南省永州市蓝山县保安员招聘考试题库附答案解析
- 2025年虚拟社交平台的发展项目可行性研究报告及总结分析
- 2025年高端制造业市场扩展可行性研究报告及总结分析
- 预拌混凝土工程施工合同(3篇)
- 静脉用药集中调配培训
- 2025及未来5-10年高速插秧机项目投资价值市场数据分析报告
- 护患沟通培训课件
- 安全管理人员培训课件
- 企业财务制度规范范本合集
- 注塑件外观不良
- 2026年中国飞机MRO软件项目经营分析报告
- 2025危大钢结构全流程施工危险源辨识、施工技术及监管要点指南(符合31号文)
- 八爪鱼救援装备系统演示文稿
- 2023年变革中国-市场经济的中国之路罗纳德哈里科斯
- DBJ-T 13-195-2022 烧结煤矸石实心砖和多孔砖(砌块) 应用技术标准
评论
0/150
提交评论