名字对象.ppt
《名字对象.ppt》由会员分享,可在线阅读,更多相关《名字对象.ppt(26页珍藏版)》请在三一办公上搜索。
1、1,十四.名字对象,概念IMoniker接口名字对象的创建根据显示名创建名字对象类名字对象的创建其他名字对象的创建简单名字对象的绑定过程。ROT表文件名字对象的绑定CoGetInstanceFromFile 函数复合名字对象概念及其绑定过程概念单项和复合名字对象的创建单项名字对象的绑定过程复合名字对象的绑定过程,2,1 概念,我们已知创建COM对象的两种方法:通过CoGetClassObject 得到类厂,通过类厂接口调用CreateInstance.直接使用CoCreateInstance 或CoCreateInstanceEx.客户使用以上两种方法在创建COM对象时,必须提供对象的CLSI
2、D或ProgID。COM提供了提供了第三种方法,即利用名字对象(moniker 绰号,名字)创建COM对象的方法。名字对象本身也是一个COM对象。名字对象为另一个COM对象提供了的符号化的表示方法,同时也对组件对象的创建过程进行封装。客户程序只需创建相应的名字对象,并使用名字对象的绑定功能得到组件对象。在这个意义上,名字对象类似于类厂对象,但是它比类厂对象提供了更多的功能.其关系对比图如下:,3,名字对象与类厂对象的功能对比示意图,4,之所以在类厂对象之外衍生出名字对象,是因为:名字对象可以以名字的方式来创建COM对象,有时候比使用CLSID的方式更方便.在一些复杂的应用中,COM对象形成了逻
3、辑上的上下级关系或者是包容的关系.在每一个级别上都是一个COM对象,下级的对象只有在上级的对象范围内才有意义,而且在确定了上级对象以后,下级对象可以更加简单(且更加明确和直观)地使用名字的方式来描述.在这种情形下,使用从上到下的名字比使用一串的CLSID更加方便合理地创建COM对象.比如Excel中的文档对象以Excel Application,WorkBook,WorkSheet、Range等层次的COM对象的方式给应用程序员提供访问接口。这些对象的状态存储在复合文档的不同级别的存储对象和流对象中.比如“c:My DocumentsMyTable.xls!Sheet2!R1C1:R2C2”表
4、示存储在文件My DocumentsMyTable.xls 的工作表Sheet2的Range R1C1:R2C2对象。这些对象往往都是永久对象。它们不仅有方法,而且有状态.它们的状态数据以复合文档的形式存储在磁盘上。如果只使用CLSID,根本不能准确地表明是标识为CLSID的COM对象的此实例,而非彼实例.所以,不仅是更直观,而且是必须以“复合名字”的方式才能准确地创建或还原这个COM对象.,5,2.IMoniker接口,名字对象是COM对象的封装和创建者.它实现了IMoniker接口.interface IMoniker:IPersistStream HRESULT BindToObject
5、(in IBindCtx*pbc,in,unique IMoniker*pmkToLeft,in REFIID riid,out,iid_is(riid)void*ppv);/其他成员未列出 IMoniker接口 派生自IPersistStream接口(p242)接口成员函数功能上分为四组:1。名字管理 2。实现绑定 3。管理复合名字对象。4。名字解析。其中最为重要的是绑定操作函数BindToObject。所有的名字对象都实现了IMoniker接口,名字对象封装了组件对象的所有状态处理过程,客户使用IMoniker接口成员。按照统一的方法处理名字对象。,6,3 名字对象的创建,3.1 根据显示
6、名创建名字对象名字对象的名字称为显示名(display name)是一种用户可读的名字.显示名可以是文件路径名,这时返回文件名字对象,也可以是组件对象的CLSID,这时返回类名字对象。也可以是经过扩充的以“!”等间隔开的复合名字,(这时返回复合名字对象)。IMoniker接口有一个方法GetDisplayName可以返回对象的显示名.然而更重要的是根据显示名来创建名字对象.WINOLEAPI MkParseDisplayName(LPBC pbc,/绑定环境LPCOLESTR szUserName,/显示名ULONG*pchEaten,/绑定过程中解析的字符个数LPMONIKER FAR*pp
7、mk/结果名字对象的指针);MkParseDisplayName根据显示名进行解析的结果生成名字对象,并以IMoniker指针的方式返回给客户。,7,名字对象有很多种,也有很多别的方法来创建名字对象。创建一个类名字对象WINOLEAPI CreateClassMoniker(REFCLSID rclsid,/该名字对象所命名的对象的CLSIDIMoniker*ppmk/结果名字对象的指针);该类名字对象将指向所命名对象的类厂对象.下面是一个客户从类名字对象得到组件对象的例子:,3.2 类名字对象的创建,8,HRESULT GetMyInterface(IMyInterface*rgpc)ICl
8、assFactory*pcf=0;/声明目标组件对象的CLSID为一个显示名 const OLECHAR pwsz=OLESTR(“clsid:E2F41FB8-BE92-4d00-A3DD-D9C285B959C1”);/为绑定和解析名字对象创建一个新的绑定环境 IBindCtx*pbc=0;ULONG cchEaten;IMoniker*pmk=0;HRESULT hr=CreatBindCtx(0,9,创建一个文件名字对象。WINOLEAPI CreateFileMoniker(LPCOLESTR lpszPathName,/文件路径LPMONIKER FAR*ppmk/结果名字对象的指
9、针);创建一个单项名字对象。WINOLEAPI CreateItemMoniker(LPCOLESTR lpszDelim,/分割符LPCOLESTR lpszItem,/显示名LPMONIKER FAR*ppmk/结果名字对象的指针);创建一个复合名字对象。WINOLEAPI CreateGenericComposite(LPMONIKER pmkFirst,/第一个名字对象LPMONIKER pmkRest,/第二个名字对象LPMONIKER FAR*ppmkComposite/结果名字对象的指针);,3.3 其他名字对象的创建:,10,4 简单名字对象的绑定过程。,4.1 ROT表COM
10、对象的激活是由COM服务的SCM(服务控制管理器)来完成的.每台支持COM的机器上都有本地的SCM。它响应客户的加载COM对象的请求。一旦对象被激活,SCM就不再介入到客户和组件对象的方法调用过程。客户以名字对象或底层API的形式访问SCM提供的服务。SCM使用ROT(Running Object Table)来管理正在运行的,已经被注册的名字对象。如果一个名字对象所指的组件对象已经在运行了,在名字对象的绑定过程中,可以直接连接到此对象上,而不必再启动新的对象。有两种方式可以得到ROT表:,11,使用GetRunningObjectTable来得到ROT表的IRunningObjectTabl
11、e指针WINOLEAPI GetRunningObjectTable(DWORD reserved,/保留LPRUNNINGOBJECTTABLE*pprot);/IRunningObjectTable 接口指针名字对象在绑定过程中要使用到绑定环境。绑定环境是COM实现的系统对象。客户可以使用CreateBindCtx函数来创建一个绑定环境对象。WINOLEAPI CreateBindCtx(DWORD reserved,/保留 LPBC FAR*ppbc);/IBindCtx 接口指针 客户可以从绑定环境中使用接口函数GetRunningObjectTable得到ROT,同时可以控制绑定过程
12、中的一些行为。以下以文件名字对象为例研究名字对象的绑定过程.,12,比如客户程序通过文件名字对象来访问一个电子表格文档对象。电子表格文件名为:“c:My DocumentsMyTable.xls”.Excel中的文档对象以Excel Application,WorkBook,WorkSheet、Range等层次的COM对象的方式给应用程序员提供访问接口。这几个对象都是永久对象。它们的状态数据以复合文档的形式存储在磁盘上。在VBA环境下或VisualBasic环境下,我们可以方便地使用VisualBasic语言访问电子表格文档对象。在C环境下,可以对这些对象进行更精细的控制。客户程序调用Crea
13、teFileMoniker或MkParseDisplayName函数来创建一个文件名字对象。得到文件名字对象的IMoniker指针。然后调用名字对象的IMoniker:BindToObject函数,一旦函数成功返回,就得到了电子表格文档对象。BindToObject内部调用了CoGetInstanceFromFile,见下:,4.2 文件名字对象的绑定,13,STDMETHODIMP FileMoniker:BindToObject(IBindCtx*pbc,IMoniker*pmkToLeft,REFIID riid,void*ppv)*ppv=0;HRESULT hr=E_FAIL;if(
14、pmkToLeft=0)/左边没有名字对象的情形 MULTI_QI mqi=CoGetInstanceFromFile函数完成了实际的创建COM对象的过程.如下:,14,4.3 CoGetInstanceFromFile 函数,HRESULT CoGetInstanceFromFile(COSERVERINFO*pServerInfo,/指向远程主机CLSID*pclsid,/要创建的对象的CLSIDIUnknown*punkOuter,/用于被聚合的情形,指向外部的 IUnknownDWORD dwClsCtx,/环境变量DWORD grfMode,/打开模式OLECHAR*szName,/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 名字 对象

链接地址:https://www.31ppt.com/p-5378585.html