- 注册时间
- 2011-3-6
- 最后登录
- 1970-1-1
该用户从未签到
|
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) |
|