`

COM原理及应用----命名和绑定技术

    博客分类:
  • COM
阅读更多

1、COM对象的创建方法

       客户程序可以通过CoCreateInstance函数创建COM,在创建之前必须知道对象的一些基本情况,比如对象的CLSID或者对象的ProgID。

       另一种对象创建方法是通过名字对象(moniker)创建,就是利用对象命名和绑定技术(即名字技术)。

 

2、名字技术的地位

       名字技术算不上COM的基本核心,但也是COM体系结构中重要的组成部分,它为客户程序和组件程序提供了另一条更为灵活的联系纽带。OLE的成功使名字技术得到了广泛的应用,而且在OLE和COM的不断发展过程中,名字技术发挥了其强大的扩展特性,异步名字对象的实现使它超越了OLE的应用范围,能更好地适用于网络环境,特别是Internet网络,体现了名字技术强大的生命力。

名字技术允许客户程序通过符号化的方式访问组件对象,而不必通过CLSID和类厂访问COM对象。名字技术不仅为COM对象提供了符号化的表达方式,而且它充分体现了面向对象软件体系的一些重要概念,甚至可以把它当作软件体系结构的一项技术来学习。

 

3、COM名字技术包括两方面内容:命名技术和绑定过程

 

4、名字对象

       名字技术的核心是名字对象,COM使用术语”moniker”来表示名字对象,它本身也是一个COM对象。名字对象为组件对象提供了符号化的表示方法,同时它也对组件对象进行了全面的封装,客户程序只需创建相应的名字对象,然后利用名字对象的绑定功能得到组件对象。名字对象能够自动使组件对象从被动状态进入运行状态,所以名字对象也称为永久智能名字(persistent intelligent names)。

       名字对象封装了组件对象的所有状态处理过程,因此客户程序可以按照统一的方法处理名字对象,即使要引用新的组件对象,客户代码也不必作任何改动。

 

5、文件名与名字对象

       文件名字对象(file moniker)是一种基本的名字对象,文件名也通过符号化的字符串名指向实际的文件。文件名代表了一个磁盘文件,文件名本身不是一个对象,它只代表了文件对象的路径,因此,文件名不具有智能特性。

       COM对象的永久状态可以是整个文件,也可以是文件的一部分。

       虽然名字对象扮演了与文件名相同的角色,但名字对象的功能要强大得多。首先,它所表达的对象范围广阔得多,除了一般的文件对象,它也可以表达文件中的部分内容,其次,名字对象具有智能特性,即它可以使被动态的对象自动进入运行态,名字对象找到与永久状态联系的运行代码,并启动这些代码,利用对象的初始化功能使对象进入运行状态,这个过程就是名字对象的绑定操作。

 

6、名字对象的绑定过程

       名字对象实现了标准的COM接口IMoniker,客户程序通过IMoniker接口获得组件对象。

       客户程序通过名字对象访问组件对象可以分成两步:第一,获得名字对象;第二,执行名字对象的绑定操作(使用IMoniker接口的函数BindToObject),绑定过程的结果就是组件对象的接口指针。

       客户程序获得名字对象的途径有两条:第一,调用COM API函数,如MkParseDisplayName和CreateFileMoniker;第二,其他对象的接口成员函数传递过来,或者通过其他的数据传输机制得到,比如通过剪贴板或拖-放操作等。

 

7、IMoniker

(1)       名字管理函数:IsEqual、Hash、IsRunning、GetTimeOfLastChange。

(2)       绑定函数:BindToObject、BindToStorage。

(3)       复合名字对象管理函数:Reduce、ComposeWith、Enum、Inverse、CommonPrefixWith、RelativePathTo、IsSystemMoniker。

(4)       名字解析函数:GetDisplayName、MkParseDisplayName。

 

8、复合名字对象


复合名字对象由一组其他的名字对象组成,也可以包括其他的复合名字对象,复合名字对象提供了一种创建任意复杂名字的机制。COM提供了一个标准的复合名字对象实现,称为“通用复合名字对象(generic composite moniker)”,并提供了标准API函数创建此类名字对象:CreateGenericComposite。

       IMoniker接口从IPersistStream派生而来,所以名字对象也是一个永久对象,它可以有自己的永久状态。复合名字对象的永久状态是一个流,它顺序保存了每个组成名字对象的永久状态。

       通用复合名字对象按统一的方式处理它的各个成员名字对象,无论是绑定过程还是其他一些操作,如名字解析、名字简化等。      

       COM使用运行对象表(ROT,running object table)表管理当前系统中正在运行的、已经被注册的名字对象,客户程序可调用COM API函数GetRunningObjectTable得到ROT表的IRunningObjectTable接口指针。

IMoniker接口的大多数成员函数以及其他一些API函数都包含一个被称为绑定环境的对象,在这些函数中,以IBindCtx接口指针的形式出现。绑定环境对象主要用于名字对象的整个绑定过程,所以它包含了绑定过程所需要的一些信息。由于绑定环境对象是COM实现的系统对象,所以COM提供了一个API函数创建它:CreateBindCtx。绑定过程比较耗时,所以绑定环境对象提供了最终时间限制参数。

绑定环境对象在复合名字对象的绑定过程中有很重要的意义,一方面,通过它,绑定过程中可以取得ROT表;另一方面,通过对绑定参数的设置可以控制绑定过程的一些行为;而且利用绑定环境对象内部的对象参数可以传递对象信息。

 

9、COM名字对象分类

       文件名字对象、复合名字对象、单项名字对象、反-名字对象、指针名字对象、类名字对象、URL名字对象。

       文件名字对象和复合名字对象以及单项名字对象是最常被使用的名字对象,它们联合起来几乎可以实现绝大多数应用的对象命名和绑定过程。而反-名字对象和指针名字对象主要用于COM系统内部。

 

10、COM名字对象分类――文件名字对象(file moniker)

       文件名字对象可以用来指定任何存储在独立文件中的对象,可以把它与文件系统中赋予文件的路径名字结合起来,文件名字对象实现了从文件路径名到代表文件的文档对象的联系过程。

 

11、COM名字对象分类――复合名字对象(composite moniker)

       复合名字对象充分体现了COM命名和绑定机制的优势,它使多个名字对象可以连接或组合在一起形成新的名字对象。由于不同类型的名字对象有可能被组合到一起,因此复合名字对象提供了连接不同名字对象空间的能力。操作系统为文件系统提供了一个公用的名字空间作为文件命名空间,因此所有的应用都按同样的方式理解文件名。类似地,每一个容器对象为它的所属对象都定义了其私有的名字空间。

       COM把名字对象的组合方式分为通用和特定两种。

 

12、COM名字对象分类――单项名字对象(item moniker)

       单项名字对象用来标识一个被包含在其他对象中的对象,包含它的那个对象被称为容器对象,对象所使用的名字空间由容器对象决定。

       单项名字对象单独存在并没有实际意义,只有当它与其他的名字对象组合之后才真正有用。最经常的用法是,在创建了单项名字对象之后,把它与一个文件名字对象组合起来形成复合名字对象,此复合名字对象给出了对象的全路径名。它与文件名字对象的结合可以描述文件内部的所有对象。

       由于文件名字对象使用了公用的名字空间,所以所有的应用程序都可以理解文件名;而单项名字对象则使用了私有的名字空间,只有容器对象才能理解单项名字对象,一个容器对象不能理解属于另一个容器对象的名字对象。因此,单项名字对象所指对象的容器对象必须实现IOleItemContainer接口,文件名字对象对应的组件对象还必须实现IPersistFile接口,这是文件名字对象的IMoniker::BindToObject接口成员函数所要求的。 IOleItemContainer接口把容器对象与下属的对象联系起来,把单项名字对象绑定到实际的对象。

       单项名字对象可以用COM提供的API函数CreateItemMoniker创建。

 

13、COM名字对象分类――反-名字对象(anti-moniker)

       通常我们在创建自定义名字对象时会用到反-名字对象,我们也可以把反-名字对象用作复合名字对象中的逆名字对象,它可以抵消掉原名字对象的作用,有如“..”在文件系统命令中所起的作用一样。

       反-名字对象可以用COM提供的API函数CreateAntiMoniker创建。

       反-名字对象通常用作简单名字对象的逆名字对象。

 

14、COM名字对象分类――指针名字对象(pointer moniker)

       指针名字对象是一个特殊的名字对象,它所指的对象只有运行状态,没有被动状态。指针名字对象只是封装了对象的接口指针。

       指针名字对象内部只管理接口指针,它没有永久状态。

       指针名字对象可以通过调用COM提供的API函数CreatePointerMoniker创建。

 

15、COM名字对象分类――类名字对象(class moniker)

       类名字对象标识了一个对象类,它内部封装了对象类的标识符CLSID。虽然我们可以通过CoCreateInstance和 CoGetClassObject创建对象,但使用类名字对象不仅可以创建对象,而且它与其他的名字对象组合之后可以形成更为灵活的对象创建或绑定机制。

       类名字对象可以用COM提供的API函数CreateClassMoniker创建。

 

16、COM名字对象分类――URL名字对象

       COM给出了异步名字对象的实现模型,它允许客户程序按异步方式执行绑定过程。在绑定进行过程中,客户程序可以得到绑定进度信息,也允许用户取消绑定操作。异步名字对象保持了与同步名字对象的兼容,它也允许绑定过程按同步方式进行。以前介绍的各种名字对象属于同步名字对象,URL名字对象属于异步名字对象。

       异步名字对象与同步名字对象的区别在于,异步名字对象不仅实现了IMoniker接口,它还实现了接口 IAsyncMoniker,IAsyncMoniker只继承了IUnknown接口,没有增加新的成员函数,它只作为异步名字对象的标志。COM提供了API函数IsAsyncMoniker,用于判断一个名字对象是否为异步名字对象。

       URL(Uniform Resource Locator,统一资源位置)名字对象,封装了几个标准的Internet协议,包括“http:”、“https:”、“ftp:”和 “gopher:”。它的显示名为URL路径名,可以是全路径名,也可以是部分路径名。

       URL名字对象可以利用函数CreateURLMoniker创建。


17、自定义名字对象

       从结构上讲,自定义名字对象只是一个支持IMoniker接口的进程内COM对象。

 

18、COM名字对象的应用

       作为名字对象的典型应用,OLE复合文档中的链接对象采用了名字对象技术,OLE复合文档应用程序为名字对象客户程序,链接对象为服务程序。

分享到:
评论

相关推荐

    dell R730双网卡绑定工具

    通过对Dell R730双网卡绑定工具的实际操作,我们可以清楚地了解到网卡绑定技术的基本原理及其在实际应用中的操作流程。通过这种方式,不仅可以有效提升网络连接的稳定性和可用性,还能实现链路聚合以增加带宽。此外...

    K8s概述、原理及应用.pdf

    ### K8s概述 ...随着云原生技术的发展,K8s将继续发挥重要作用,支持更多的创新和应用。无论是微服务架构、大数据处理还是机器学习平台,K8s都能够提供灵活、高效的解决方案,帮助企业实现数字化转型的目标。

    ASP.NET数据绑定技术应用

    ### ASP.NET 数据绑定技术应用详解 #### 摘要 数据绑定是ASP.NET中的核心功能之一,它允许开发者将程序中的数据与用户界面元素(如控件)进行连接,使得数据变化时,用户界面上相应的元素也能实时更新。本文旨在...

    大数据技术与应用-《Web前端框架开发》作业-谢丽华.zip

    在大数据技术与应用的课程中,Web前端框架开发是一个至关重要的部分,因为它涉及到现代Web应用程序的构建和优化。本作业由谢丽华同学完成,主要关注Vue.js框架,这是一个广泛使用的JavaScript框架,用于构建交互式的...

    COM原理与应用

    《Inside COM》这本书是了解和学习COM原理与应用的经典之作。 COM的主要概念包括以下几个方面: 1. **组件**:COM组件是独立于应用程序的二进制模块,可以被多个程序共享和使用。它们提供了封装的功能,允许开发者...

    数据库管理与应用-3期(KC004) 任务7 单元设计.docx

    2. 数据控件的使用:熟练掌握DataGridView(在Windows应用程序中)和GridView(在Web应用程序中)这两个数据展示控件的基本操作,如数据绑定、排序、过滤和编辑功能。 3. 编写连接字符串:能够根据具体需求编写连接...

    MapX教程之数据库绑定篇 

    - `Name`:为绑定后的`Dataset`命名,便于后续的管理和使用。 - `GeoField`:指定数据库表中的一个字段作为与图层匹配的关键字段。如果不指定,MapX会尝试自动匹配。 - `SecondaryGeofield`:当主匹配字段存在...

    Visual C#.NET原理与实务(第5-9章)

    在《Visual C#.NET原理与实务》一书中,第5-9章涵盖了多个关键的IT知识点,这些章节深入探讨了C#.NET编程的核心概念和技术,包括网络编程、组件设计、XML技术、WEB应用程序开发以及数据库编程。以下是这些章节的详细...

    WCF http绑定服务端 客户端调用

    **WCF(Windows Communication Foundation)**是微软.NET框架下的一种面向服务的通信技术,它提供了一种统一的方式来创建、发布和使用跨网络的应用程序服务。本主题将深入探讨使用HTTP绑定在WCF服务端和客户端之间的...

    轻松学会c# 反射浅析原理及应用教程

    ### 轻松学会C# 反射浅析原理及应用教程 #### 一、C#反射概述 C#反射是一种强大的技术,它允许程序员在运行时获取类型的信息,并能够调用类型的方法或属性,甚至是那些私有的成员。反射机制在.NET框架中由多个类...

    Tomcat中JNDI原理

    - **上下文**:用于查找和绑定命名信息的环境。 在Tomcat中,JNDI实现是基于标准JNDI API的,但针对Web应用服务器做了特定优化。它使用`org.apache.naming.NamingContext`作为其上下文实现,这使得开发者可以通过...

    人品计算器C#应用程序源码+图片+参考资料+原理

    - 对于初学者,学习如何组织和管理源代码文件是非常重要的,包括文件命名规范和代码注释。 7. **软件发布**: - 熟悉.NET Framework或.NET Core的部署过程,将编译后的应用程序打包成可执行文件,供他人下载和...

    System.Windows.Forms 命名空间源码

    通过阅读和理解`System.Windows.Forms`命名空间的源码,开发者可以学习到微软如何设计和实现这些基础组件,这对于提升自己的编程技能和优化应用性能都大有裨益。同时,源码分析也有助于理解.NET Framework底层的工作...

    最新WPF开发教程,WPF的体系结构,XAML,控件开发,数据绑定,图形和多媒体开发

    - **三维变换应用**:学习 3D 变换的原理和实现方法。 - **动画开发**:掌握如何为 WPF 应用添加动画效果。 - **多媒体开发**:如何集成音频和视频播放功能。 通过以上内容的学习,开发者可以全面地掌握 WPF 的基础...

    Windows应用高级编程-C#编程篇(PDF)

    7. 文件和注册表操作:Windows应用经常需要与文件系统和注册表交互,书中将介绍相关的类库和方法,如System.IO命名空间和Microsoft.Win32命名空间,以及如何安全地处理这些操作。 8. 多线程和异步编程:在现代应用...

    《Java EE企业级应用开发教程Spring+Spring MVC+MyBatis》_源代码.zip

    《Java EE企业级应用开发教程Spring+Spring MVC+MyBatis》是一本深入探讨Java企业级应用程序...通过学习和实践这些源代码,开发者可以深入理解Spring、Spring MVC和MyBatis的工作原理,并能熟练地在实际项目中应用。

    Protel99SE多张原理图生成一张总网表的方法

    1. **文件命名规范**:为了便于管理和识别,建议在创建原理图文件时采用统一的命名规则。 2. **检查完整性**:在生成总网表之前,仔细检查每个子原理图的完整性,确保没有遗漏或错误的连接。 3. **版本控制**:对于...

    C#网络编程及应用源代码

    本主题聚焦于"C#网络编程及应用源代码",这意味着我们将探讨如何利用C#进行网络通信,创建网络应用程序,并通过实际的源代码加深理解。 1. **网络基础**: - C#中的`System.Net`命名空间提供了用于网络编程的基础...

    j2ee-1_4-doc-tutorial

    这个教程是针对开发者设计的,帮助他们理解和使用 J2EE 1.4 版本的各种组件和技术。 **教程内容概览:** 1. **J2EE 架构基础** - J2EE 架构的分层模型,包括客户端、Web 层、业务逻辑层和数据访问层。 - EJB...

Global site tag (gtag.js) - Google Analytics