Com对象的实现(续.ppt_第1页
Com对象的实现(续.ppt_第2页
Com对象的实现(续.ppt_第3页
Com对象的实现(续.ppt_第4页
Com对象的实现(续.ppt_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

COM对象的实现(续),潘爱民2003-10-10,复习,COM对象IDL描述对象的创建:类厂位置透明注册表自注册的COM组件,回顾:客户创建对象过程,客户提供信息组件位置、clsid、iid、结果接口指针地址ppv过程:根据组件位置,LoadLibraryGetProcAddress,获取DllGetClassObject用clsid和IID_IClassFactory获得类厂对象接口指针pFactory用iid、ppv调用pFactory-CreateInstance位置透明性的实现利用注册表在COM组件和客户之间引入中介,COM库,创建过程COM库处于COM组件和客户中间调用过程对于进程内组件,COM库不再参与处理,COM对象创建过程,COM创建函数,COM库中三个用于创建组件的函数:CoGetClassObjectCoCreateInstanceCoCreateInstanceEx,CoGetClassObject,创建一个类厂HRESULTCoGetClassObject(constCLSID,CoCreateInstance,HRESULTCoCreateInstance(constCLSID,CoCreateInstance实现伪码,HRESULTCoCreateInstance(constCLSID,CoCreateInstanceEx,HRESULTCoCreateInstanceEx(constCLSID,三个创建函数选用原则,如果客户创建远程对象或者希望一次获取对象的多个接口指针,则选用CoCreateInstanceEx函数;如果客户希望获取类厂对象或者要调用类厂的某些成员函数,则选用CoGetClassObject函数;在其他情况下,使用CoCreateInstance函数创建对象,这是最常用的方法。,创建过程示意图,类厂的实现,classCDictionaryFactory:publicIClassFactoryprotected: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的实现,externCHRESULT_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:publicIUnknownvoid*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;charpszProgID128;hResult=:ProgIDFromCLSID(CLSID_Dictionary,组件程序的装载和卸载,进程内组件的装载DllGetClassObject进程外组件的装载“/Embedding”命令行参数进程内组件的卸载CoFreeUnusedLibraries进程外组件的卸载main或者WinMain函数退出,进程内组件的卸载,组件不能自己卸载客户调用COM库函数CoFreeUnusedLibrariesCOM库调用DLL组件的引出函数HRESULTDllCanUnloadNow();若DllCanUnloadNow返回S_OK,则同意卸载若DllCanUnloadNow返回S_FALSE,则不同意卸载DllCanUnloadNow实现:对象计数+锁计数,COM库中一些常用函数,初始化函数GUID有关的函数对象创建函数内存管理函数,表达方法的操作结果,32位整数,类别码:反映了函数调用结果的基本情况操作码:标识了结果操作来源,HRESULT数据结构,操作码#defineFACILITY_WINDOWS8#defineFACILITY_STORAGE3#defineFACILITY_RPC1#defineFACILITY_SSPI9#defineFACILITY_WIN327#defineFACILITY_CONTROL10#defineFACILITY_NULL0#defineFACILITY_INTERNET12#defineFACILITY_ITF4#defineFACILITY_DISPATCH2#defineFACILITY_CERT11,Win32SDK的头文件WinError.h,HRESULT,类别码00-表示函数调用成功01-包含了一些信息10-警告11-错误,HRESULT(续),FormatMessage函数SUCCEEDED和FAILED宏常用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论