看流星社区

 找回密码
 注册账号
查看: 2042|回复: 0

Com是由COM规范及COM库

[复制链接]

该用户从未签到

发表于 2013-5-10 16:46:50 | 显示全部楼层 |阅读模式
Com是由COM规范及COM库组成的 Com是由接口及其实现类组成 Com的接口在内存结构上跟C++的纯抽象基类相似 COM接口是组件的行为方式的集合,及函数的集合 COM的接口必须要有遍历性 COM组件必须要实现的接口是IUnknown接口。IClassFactory接口可选 IUnknow接口有三个函数:QueryInterface,AddRef(),Release();
COM组件必须要实现的入口函数是DllGetObjectClass,其用来创建类厂,类厂再创建COM对象
COM组件通过类厂来创建COM对象。类厂也是一个COM对象。类厂必须要实现CreateInstance()函数来创建com对象。类厂通过lockserver来控制组件的生存期 一个COM组件应包含创建COM对象的类厂及COM对象本身
COM库充当了客户程序与COM组件联系的桥梁。COM库为COM组件提供各种服务,COM库使用前须要调用CoInitialize初始化,程序结束后须调用UnInitialize释放COM库所占用的资源。有三个函数用于组件的生存:Cocreateinstance(),Cogetclassobject(), CocreateinstanceEx()用于创建远程对象

COM组件分为进程外组件与进程内组件。进程内组件是以DLL形式提供,运行时跟客户程序在同一进程空间;进程外组件是以独立进程(exe)形式提供,运行在另一进程空间

进程外COM组件检测到/Embedding参数后,创建类厂对象,然后调用CoRegisterClassObject把类厂对象注册到COM中。

进程内组件的卸载是由客户程序调用CofreeUnusedLibraries,其调用DllCanUnloadNow(组件中对象数为0,类厂锁计数器为0即为可卸载);进程外组件的卸载简单,由于其本身是一EXE进程。只要其winmain满足退出条件即可,有必要时调用CoDisconnectObject强行使客户程序跟COM对象的联系终止进程


1、客户程序
客户调用COM库函数CoCreateInstance ,以得到类厂接口指针

2、COM库
COM库函数CoCreateInstance调用CogetClassObject,在函数CogetClassObject中完成查找注册表,找到COM组件DLL装入,并调用COM组件DLL中实现的函数
DllGetClassObject,以得到类厂接口指针

3、COM组件
DllGetClassObject函数创建类厂,并逆序返回类厂接口指针给COM库函数
CoGetClassObject

4、客户程序
调用类厂中的创建函数,以创建COM对象

5、COM组件
类厂创建函数完成创建COM对象,类厂将COM对象逆序返回给函数CoCreateInstance

6、客户程序
从函数CoCreateInstance 返回中得到COM对象,客户程序开始使用COM对象

COM库提供了大量的辅助函数,其中关于GUID的两个常用函数是CLSIDFromProgID,用来将字符串形式的对象标识转换成GUID结构。StringFromCLSID刚好作用相反。

HRESULT不是句柄,分为四部分。30-31为类别码,表示调用情况;29位为自定义标志;16-28为操作码,表示结果操作来源;0-15为操作结果码,表示本次操作的状态。自定义返回值时最好符合上述规定。Win32 sdk 的头文件WinError.h包括了所有win32函数的返回结果,其中也包括所有COM库函数及OLE函数的结果宏定义。典型的如S_OK,S_FALSE。可以调用WIN32函数FormatMessage返回结果值的对应说明字符串;由于多返回值的原因,我们在判断函数调用是否成功时要用宏:
SUCCEEDED(hr)或 FAILED(hr)
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-5-14 09:37

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表