Com对象的实现(续.ppt

上传人:牧羊曲112 文档编号:6503227 上传时间:2023-11-07 格式:PPT 页数:36 大小:394.82KB
返回 下载 相关 举报
Com对象的实现(续.ppt_第1页
第1页 / 共36页
Com对象的实现(续.ppt_第2页
第2页 / 共36页
Com对象的实现(续.ppt_第3页
第3页 / 共36页
Com对象的实现(续.ppt_第4页
第4页 / 共36页
Com对象的实现(续.ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《Com对象的实现(续.ppt》由会员分享,可在线阅读,更多相关《Com对象的实现(续.ppt(36页珍藏版)》请在三一办公上搜索。

1、COM对象的实现(续),潘爱民2003-10-10http:/,复习,COM对象IDL描述对象的创建:类厂位置透明注册表自注册的COM组件,回顾:客户创建对象过程,客户提供信息组件位置、clsid、iid、结果接口指针地址ppv过程:根据组件位置,LoadLibraryGetProcAddress,获取DllGetClassObject用clsid和IID_IClassFactory获得类厂对象接口指针pFactory用iid、ppv调用pFactory-CreateInstance位置透明性的实现利用注册表在COM组件和客户之间引入中介,COM库,创建过程COM库处于COM组件和客户中间调用

2、过程对于进程内组件,COM库不再参与处理,COM对象创建过程,COM创建函数,COM库中三个用于创建组件的函数:CoGetClassObjectCoCreateInstanceCoCreateInstanceEx,CoGetClassObject,创建一个类厂HRESULT CoGetClassObject(const CLSID,CoCreateInstance,HRESULT CoCreateInstance(const CLSID,CoCreateInstance实现伪码,HRESULT CoCreateInstance(const CLSID,CoCreateInstanceEx,HR

3、ESULT CoCreateInstanceEx(const CLSID,三个创建函数选用原则,如果客户创建远程对象或者希望一次获取对象的多个接口指针,则选用CoCreateInstanceEx函数;如果客户希望获取类厂对象或者要调用类厂的某些成员函数,则选用CoGetClassObject函数;在其他情况下,使用CoCreateInstance函数创建对象,这是最常用的方法。,创建过程示意图,类厂的实现,class CDictionaryFactory:public IClassFactory protected:ULONG m_Ref;public:CDictionaryFactory(v

4、oid);CDictionaryFactory(void);/IUnknown members HRESULT QueryInterface(const IID,CreateInstance函数的实现,HRESULT CDictionaryFactory:CreateInstance(IUnknown*pUnknownOuter,const IID/待续,CreateInstance函数的实现(续),/续上页/Obtain the first interface pointer(which does an AddRef)hr=pObj-QueryInterface(iid,ppv);if(hr

5、!=S_OK)g_DictionaryNumber-;delete pObj;return hr;,DllGetClassObject的实现,extern C HRESULT _stdcall DllGetClassObject(const CLSID,类厂对组件生存期的控制,组件引用计数不计类厂IClassFactory:LockServer函数,COM库,COM库的初始化COM库的内存管理组件程序的装载和卸载常用函数和HRESULT,COM库的组成,用于创建过程的SCM(Service Control Manager)rpcss.exeole32.dll其他提供COM环境管理server、

6、组件等,COM库的组成(续),COM应用(COM client),Service Control ManagerRPCSS.EXE,COM应用(COM server),OLE32.DLL,OLE32.DLL,COM库的初始化,基本的初始化函数:HRESULT CoInitialize(void*pReserved);初始化之前唯一可以调用的函数:DWORD CoBuildVersion();另一个初始化函数:CoInitializeExCOM库的终止函数:void CoUninitialize(void);,有关CLSID和ProgID的COM函数,IsEqualGUID、IsEqualIID

7、、IsEqualCLSIDCLSIDFromProgID、ProgIDFromCLSIDStringFromCLSID、CLSIDFromStringStringFromIID、IIDFromStringStringFromGUID2内存由调用者分配注意:COM库函数的字符串使用OLECHAR类型,COM库的内存管理,COM库提供了内存管理器以及内存管理器的标准HRESULT CoGetMalloc(DWORD dwMemContext,IMalloc*ppMalloc);class IMalloc:public IUnknownvoid*Alloc(ULONG cb)=0;void*Real

8、loc(void*pv,ULONG cb)=0;void Free(void*pv)=0;ULONG GetSize(void*pv)=0;int DidAlloc(void*pv)=0;voidHeapMinimize()=0;,COM库内存管理用法(一),DWORD length=MAX_LENGTH;IMalloc*pIMalloc;HRESULT hr;hr=CoGetMalloc(MEMCTX_TASK,COM库内存管理用法(二),三个封装函数:void*CoTaskMemAlloc(ULONG cb);void CoTaskMemFree(void*pv);void CoTaskM

9、emRealloc(void*pv,ULONG cb);,COM库内存管理用法(三),DWORD length=MAX_LENGTH;IMalloc*pIMalloc;HRESULT hr;psz=CoTaskMemAlloc(length);if(NULL=psz)/return failure.pszText=psz;,COM库内存管理用法(四),WCHAR*pwProgID;char pszProgID128;hResult=:ProgIDFromCLSID(CLSID_Dictionary,组件程序的装载和卸载,进程内组件的装载DllGetClassObject进程外组件的装载“/Em

10、bedding”命令行参数进程内组件的卸载CoFreeUnusedLibraries进程外组件的卸载main或者WinMain函数退出,进程内组件的卸载,组件不能自己卸载客户调用COM库函数CoFreeUnusedLibrariesCOM库调用DLL组件的引出函数HRESULT DllCanUnloadNow();若DllCanUnloadNow返回S_OK,则同意卸载若DllCanUnloadNow返回S_FALSE,则不同意卸载DllCanUnloadNow实现:对象计数+锁计数,COM库中一些常用函数,初始化函数GUID有关的函数对象创建函数内存管理函数,表达方法的操作结果,32位整数,

11、类别码:反映了函数调用结果的基本情况操作码:标识了结果操作来源,HRESULT数据结构,操作码#define FACILITY_WINDOWS 8#define FACILITY_STORAGE 3#define FACILITY_RPC 1#define FACILITY_SSPI 9#define FACILITY_WIN32 7#define FACILITY_CONTROL 10#define FACILITY_NULL 0#define FACILITY_INTERNET 12#define FACILITY_ITF 4#define FACILITY_DISPATCH 2#defi

12、ne FACILITY_CERT 11,Win32 SDK的头文件WinError.h,HRESULT,类别码00-表示函数调用成功01-包含了一些信息10-警告11-错误,HRESULT(续),FormatMessage函数SUCCEEDED和FAILED宏常用定义,总结:实现一个进程内COM组件的步骤,定义必要的CLSID和IID实现COM对象通过QueryInterface暴露其接口管理引用计数,注意对全局引用计数的维护实现类厂对象对象的引用计数不记在全局对象引用计数内维护锁计数实现DllGetClassObject、DllCanUnloadNow(可选)实现两个注册函数,进程内组件与客户的协作过程,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号