发现对象接口的技术的制作方法

文档序号:6442217阅读:135来源:国知局
专利名称:发现对象接口的技术的制作方法
发现对象接口的技术
背景技术
面向对象编程(OOP)是使用对象设计软件程序的编程技术。对象可包括具有数据字段、方法、属性和事件的定义集合的数据结构的离散集合。每个对象能够接收消息、处理数据并向其他对象发送消息。可在同一进程或不同进程中执行其他对象。进程是正被执行的软件程序的实例。取决于操作系统,进程可被实现为一个或多个执行线程,其同时执行来自软件程序的指令。典型地,不同进程(或在一些情况下,单个进程的不同线程)中执行的对象利用某一形式的进程间通信(IPC)在不同进程之间交换数据。IPC技术可包括涉及消息传递、同步、共享存储器以及远程过程调用(RPC)的操作。基于诸如在进程或进程的线程之间的通信的带宽和延迟、以及被传送的数据的类型之类的因素,可使用不同的IPC技术。IPC技术的改进可导致更有效的软件程序和架构。正是针对这些或其他考虑而已经需要本改进。

发明内容
提出本发明内容以简化的形式介绍以下在具体实施方式
中进一步描述的概念选集。本发明内容既不意图标识要求保护主题的关键特征或重要特征,也不意图被用于辅助确定要求保护主题的范围。各个实施例总体上针对软件编程技术。具体地,一些实施例针对增强的IPC技术, 其被设计为改进不同进程或进程线程中操作的对象之间的通信。增强的IPC技术以安全和独立的方式,允许在一个进程(或线程)中运行的一个对象容易地发现和连接到在不同的进程(或线程)中运行的另一对象。例如,在一个实施例中,设备可包括与存储器通信性耦连的处理器。存储器可存储具有对象关联组件和对象发现组件的IPC组件。对象关联组件可被安排为生成映射信息, 其表示应用对象和系统对象之间的映射。更具体地,映射信息可表示针对第一进程中执行的应用程序的应用对象和针对第二进程中执行的系统程序的系统对象的系统对象句柄的应用对象接口。对象关联组件可创建针对存储器映射文件的存储器映射文件名,并在存储器映射文件中存储具有映射信息的记录。对象发现组件允许系统对象,在诸如进程崩溃的情况下,使用关于应用对象和/或存储器映射文件中存储的应用对象接口的信息来发现应用对象。这可通过允许系统对象使用一条已知的信息(诸如系统对象句柄)生成存储器映射文件名来完成。以此方式,系统对象可生成独立于应用对象的存储器映射文件名,由此消除与应用对象进行通信以在访问存储器映射文件之前取得存储器映射文件名的任何需要。描述并要求了其他实施例。提供阅读以下具体实施方式
和查看关联附图,这些和其他特征及优势将是清楚的。将理解,对于所要求的各方面,前述总体描述和以下具体实施方式
两者均仅是说明性的而非限制性的。


图1例示了 IPC系统的实施例。图2例示了 IPC组件的实施例。图3例示了存储器映射文件的实施例。图4A例示了用户接口视图的实施例。图4B例示了修改的用户接口视图的实施例。图5例示了第一逻辑流的实施例。图6例示了第二逻辑流的实施例。图7例示了计算架构的实施例。
具体实施例方式各种实施例目的为增强的IPC技术,以促进在不同进程或单个进程的不同线程中操作的对象的发现和通信。一些实施例利用存储器映射文件来存储发现操作中的有用信息,诸如关于对象和/或用于对象的接口的信息。例如,在一个实施例中,存储器映射文件可存储关于应用对象和应用对象标识符(诸如应用接口标识符(IID))的信息。存储器映射文件具有唯一的和可创建的存储器映射文件名,其可由在任何一个线程中的任何一个对象利用单段共享数据(例如,诸如对象句柄的唯一标识符)自动生成。以此方式,在不同进程 (或线程)中执行的不同对象可发现并直接互相连接而不必通过其他对象或程序发送消息。 因此,实施例可改进软件程序的可承受性、可扩缩性、模块性、可扩展性或互操作性。图1例示了 IPC系统100的框图,其包括或实现增强的IPC技术,以促进在不同的软件程序及其关联对象之间的发现和通信。例如,在一个实施例中,IPC系统100可包括具有多个组件130、132和136的计算机实现的IPC系统100。作为此处使用的术语“系统”和 “组件”意图指的是与计算机有关的实体,包括硬件、软件和硬件的组合、软件或执行中的软件。例如,组件可被实现为处理器上运行的进程、处理器、硬盘驱动器、多个存储驱动器(光学和/或磁存储介质的)、对象、可执行程序、执行线程、程序和/或计算机。通过例示的方式,服务器上运行的应用和服务器两者可以是组件。一个或多个组件可驻留在进程和/或执行线程内,且组件可定位在一台计算机上和/或如给定的实现方式所期望的那样分布在两台或多台计算机之间。实施例不限于该环境。在图1示出的例示实施例中,IPC系统100可被实现为电子设备的一部分。电子设备的例子可包括但不限于移动设备、个人数字助理、移动计算设备、智能电话、蜂窝电话、手机、单向寻呼机、双向寻呼机、消息设备、计算机、个人计算机(PC)、台式计算机、膝上型计算机、笔记本计算机、手持式计算机、平板计算机、服务器、服务器阵列或服务器组、网上服务器、网络服务器、因特网服务器、工作站、小型计算机、大型计算机、超级计算机、网络电器、 网上电器、分布式计算系统、多处理器系统、基于处理器的系统、消费电子产品、游戏设备、 可编程消费电子产品、电视、数字电视、机顶盒、无线接入点、基站、用户台、移动用户中心、 无线电网络控制器、路由器、集线器、网关、网桥、交换机、机器或其组合。虽然图1示出的 IPC系统100在某一拓扑中具有有限数目的元件,可预想到的是,如给定的实现方式所期望的、IPC系统100在替代拓扑中可包括更多或更少元件。组件130、132和136可经由各种类型的通信介质通信性地耦连。组件130、132和 136可在彼此之间协调操作。协调可涉及单向或双向地交换信息。例如,组件130、132和136可以在通信介质上传送的信号的方式来传送信息。信息可被实现为分配给各种信号线的信号。在这样的分配中,每个消息是信号。然而,其他实施例可替代地采用数据消息。可通过各种连接发送这样的数据消息。示例连接包括并行接口、串行接口和总线接口。例如,在一个实施例中,IPC系统100可包括或实现诸如通信性耦连到存储器106 的处理器102之类的处理系统。存储器106可存储IPC组件130。处理器102 (或另一处理器)可执行IPC组件130,以总体地管理各种软件程序及在不同进程或处理线程中执行的关联对象之间的IPC操作。例如,IPC组件130可允许来自一个软件程序的对象使用共享存储器技术和唯一名称分配来发现另一软件程序的对象、并与之连接和通信。可按照给定的OPP体系架构、参考或模型来实现软件程序。总体上,对象可包括具有数据字段、方法、属性和事件的定义集合的数据结构的离散集合。每个对象能够接收消息、处理数据并向其他对象发送消息。换句话说,每个对象可被视为具有不同角色或责任的独立“机器”。这样,软件程序可表示交互对象的集合。进程是正被执行的软件程序的实例。其包含程序代码及其当前活动。取决于操作系统(0S),进程可由同时执行指令的多个执行线程构成。软件程序是存储在存储器104中的指令的被动集合(passive collection).进程是处理器102对那些指令的实际执行。一些进程可与同一软件程序相关联。例如,开始同一程序的几个实例经常意味着多于一个进程正被执行。在各种实施例中,处理器102可被布置为执行不同进程中的不同软件程序。例如, 在图1示出的例示实施例中,处理器102执行第一进程104中的应用程序110和第二进程 114中的系统程序120。用于应用程序110的例子可包括来自独立或互相关的应用(例如, 字处理器、电子制表、演示、绘图、数据库、笔记等,诸如华盛顿州雷德蒙德的微软公司制作的MICR0S0FT 0FFICE)套件中的产品程序。用于系统程序120的例子可包括被实现用于前述电子设备(例如,计算设备)的操作系统(OS)及相关联的图形用户接口(GUI),诸如华盛顿州雷德蒙德的微软公司制作的MICROSOFT WINDOWS 。可预想到,这些仅仅是用于软件程序 110、120的示例,而且需要进程间通信支持的任何软件程序都可被用于给定的实现方式。实施例不限于该环境。值得注意的是,虽然图1例示了单个处理器102执行不同线程104、114的,但可预想到,不同的处理器可各自执行不同的线程104、114。而且,虽然图1示出了处理器102执行不同进程104、114,但可预想到,单个进程可具有利用IPC组件130的不同的处理线程。当被执行时,软件程序110、120可每个都在运行时间期间实例化被设计为彼此交互的一个或多个对象。如所示,应用程序Iio可实例化应用对象112,且系统程序120可实例化系统对象122。用于应用对象112的例子可包括呈现文档的文档对象。系统对象122 的例子可包括用于GUI的窗口对象来呈现文档对象。其他对象是可能的。可预想到的是, 对象112、122可具有彼此共同的特征,且总体上软件对象包括具有数据字段、方法、属性和事件的定义集合的数据结构的离散集合。进一步地,对象112、122能够接收消息、处理数据并向其他对象发送消息(包括彼此发送)。应用对象112还可包括应用对象接口 114。应用对象接口 114 一般可包括用于与另一对象传递消息的接口。例如,如果应用对象112是用于字处理器的文档,则应用对象接口 114可被用于接收来自输入设备的击键以显示在文档上。例如,在各种实施例中,应用对象接口 114可符合使得应用对象112能与诸如系统对象122的其他对象交互的对象模型和编程参数集。例如,在一个实施例中,应用对象接口 114可被实现为Microsoft组件对象模型(COM)接口。COM接口是允许访问应用对象112的相关函数或方法的集合。典型地,通过指向COM接口的指针来访问COM接口。同样可以为符合不同类型的对象模型和编程参数的应用对象112实现其他对象接口。实施例不限于该环境。系统对象122还可包括系统对象句柄124。系统对象句柄IM是系统程序120分配给其创建的每个系统对象的唯一标识符。系统对象句柄1 可用于唯一地标识系统对象 124,以便其可被诸如应用对象112之类的其他对象使用。系统对象句柄123可具有以由公开对象接口的程序和使用(consume)对象接口的程序两者重新创建的方式分配给它们的 “对象名”。例如,在一个实施例中,系统程序120可被实现为MICROSOFT WINDOWS 0S,系统对象122可被实现为用于其⑶I的窗口对象,且系统对象句柄IM可包括窗口句柄(HWND)。 由于HWND不会同时分配给两个系统对象,所以给定的HWND是唯一的。因为对象112、122在不同进程104、114 (或在一些情况下,单个进程中的不同线程)中执行,所以对象112、122可能需要某一形式的进程间通信(IPC)以跨越不同进程104、 114的处理边界来交换数据。为此,IPC组件130可实现各种增强的IPC技术,以支持与消息传递、同步、共享存储器和远程过程调用(RPC)相关的操作。如所示,IPC组件130可尤其包括对象关联组件132、存储器映射文件134和对象发现组件136等。例如,在各种实施例中,IPC组件130、对象关联组件132和/或对象发现组件136可被实现为一个或多个应用程序接口(API),其被存储为调用程序(例如,如应用程序110和系统程序120)可用的软件库的一部分。然而,实施例不限于此类实现方式。在一个实施例中,API可以具有运行时间执行的二进制形式。图2例示了 IPC组件130的更详细框图。更具体地,图2例示了在对象关联组件 132、存储器映射文件134和对象发现组件136之间的示例信息流。信息可被实现为分配给各种信号线的信号。在这样的分配中,每个消息是信号。然而,替代实施例可采用数据消息。 可通过各种连接发送这样的数据消息。示例连接包括并行接口、串行接口和总线接口。对象关联组件132 —般可被布置为将各种对象关联在一起,以便其能彼此交互或互操作,例如,作为观察者/主题对象或客户端/服务器对象。关联可包括用于在对象之间建立和移除连接的各种类型的信息。例如,在一个实施例中,处理器102可执行对象关联组件132以生成映射信息202,其表示在对象112、122之间的某一形式的映射或关联。例如, 映射信息202可包括映射第一进程104中执行的应用程序110的应用对象112与第二进程 114中执行的系统程序120的系统对象122的系统对象句柄124的应用对象接口 114的信息(例如,指针、参考、句柄、名字对象(moniker)等)。对象关联组件132可创建存储器映射文件134以存储映射信息202。存储器映射文件134可包括软件程序110、120可访问的存储器106中的共享存储器的一部分。存储器映射文件134包含虚拟存储器中的文件内容。在文件和存储器空间之间的该映射使得包括多个进程的软件程序能通过阅读并直接写入虚拟存储器而修改文件。存储器映射文件134 可存储映射信息202并由页面文件(paging file)支持。页面文件上将设置有系统访问控制列表(SACL),其不允许以低集成级别运行的进程访问页面文件,从而访问所公开的服务和接口。管理集成级别的技术可包括访问控制条目(ACE)集成技术等。CN 102541543 A
可跨越多个进程共享存储器映射文件134。这样,软件程序110、120可经由存储器映射文件134跨越进程边界共享数据。例如,应用程序110可将某些数据写入存储器映射文件134,且系统程序120可从存储器映射文件134中读取数据,反之亦然。在一个实施例中,存储器映射文件134可包括或被实现为记录阵列,每个记录具有映射信息202和任何关联字段(例如,头、终结符、元数据等)的集合。在一个实施例中,应用程序110可创建并管理存储器映射文件134,即,应用程序 110调用对象关联组件132。以此方式,在系统程序120和/或系统对象122具有意外的关闭或异常终止事件的情景中,存储器映射文件134将保持可发现。系统程序120可重启或重实例化系统对象122。然后,系统程序120和/或系统对象122可尝试利用对象发现组件136发现应用对象112。替代地,系统程序120可创建并管理存储器映射文件134。然而,有可能是这种情景,如果应用程序110要具有意外的关闭或重启事件,则相关联的系统对象也同样会被关闭,且一旦应用程序110重启,则被重实例化,因此具有更少用于在对象之间发现操作的需要。实施例不限于该环境。当被调用时,对象关联组件132可创建存储器映射文件和用于存储器映射文件 134的存储器映射文件名204。存储器映射文件名204包括用于存储器映射文件134的唯一标识符。在一个实施例中,在维护足够的唯一性以避免与其他进程的冲突的同时,可由在进程104、114两者中的对象112、122创建存储器映射文件名204。在一个实施例中,如以下参考图5的描述,可使用系统对象122的系统对象句柄IM创建存储器映射文件名204。对象关联组件132可在存储器映射文件134中存储具有映射信息202的记录。一旦存储器映射文件134已被创建了,则对象关联组件132可在存储器映射文件134中存储一个或多个记录,每个记录具有用于关联对象(例如,对象112、122)的映射信息202。可以参考图3更详细地描述针对存储器映射文件134及其存储的记录的例子。一旦对象关联组件132创建存储器映射文件134并存储具有映射信息202的记录,则可使用对象发现组件136从存储器映射文件134中取出映射信息202。对象发现组件136允许系统对象122诸如在系统崩溃的情况下使用存储器映射文件134发现应用对象112。这可通过允许系统对象122使用一段已知的信息,诸如系统对象句柄124 (例如, HWND),来生成存储器映射文件名204。以此方式,系统对象122可生成独立于应用对象112 的存储器映射文件名204,这意指系统对象122无需询问应用对象112以在访问存储器映射文件134之前取得存储器映射文件名204。例如,在图2示出的例示实施例中,对象发现组件136接收服务请求210,确定用于系统对象122的系统对象句柄124,并使用系统对象句柄IM创建用于存储器映射文件134 的存储器映射文件名204。由于系统对象122由系统程序120创建,该系统程序120将系统对象句柄1 分配给系统对象122,对象发现组件136可从由进程114使用的同一地址空间内取得系统对象句柄124。为了创建存储器映射文件名204,对象发现组件136可调用用于初始地创建存储器映射文件名204的同一 API,将系统对象句柄IM作为API签名的输入参数来传递。替代地,对象发现组件136可使用同一或类似的逻辑作为该API,以仅使用系统对象句柄1 来再生成存储器映射文件名204。然后,对象发现组件136可使用存储器映射文件名204定位存储器映射文件134,并从存储器映射文件134取得具有映射信息202 的记录。对象发现组件136可对映射信息202进行解码以发现用于应用对象112的应用对象接口 114的指针、参考、句柄或其他位置信息。对象发现组件136可将位置信息返回指系统对象122。系统对象122可使用位置信息以发现应用对象112及其应用对象接口 114,并使用应用对象接口 114在应用对象112和系统对象122之间建立消息连接。图3例示了用于存储器映射文件134的例子。在图3示出的例示实施例中,存储器映射文件Π4可包括记录302-a的阵列。每个记录302-a可包括具有标头304_b和映射信息306-c集的数据结构。例如,映射信息306-c可表示映射信息202。值得注意的是,如此处使用的“a”和“b”和“C”和类似的标志符意图是表示任何正整数的变量。因此,例如,如果实现方式设置值为a = 5,则记录302-a的完整集合可包括记录302-1、302-2、302-3、302-4和302-5。实施例不限于该环境。标头304-b可描绘具有映射信息306-c集的记录302-a的开头。在一个实施例中, 每个标头304-b可包括签名、映射信息306-c的大小和服务标识符。这可如以下表1所例示
表 1___
DWORDIdwSig|“ffSVC,,
ULARGE—INTEGER cbStreamSize~ 编组流大小 GUID!serviced |服务标识符一
在标头304-b之后是映射信息306-c。如例示,存储器映射文件134可包含具有至少两
个记录的阵列,包括记录302-1,其包括标头304-1和映射信息306-1,和记录302-2,其包括
标头304-2和映射信息306-2。可用被指示为文件终结符308的特殊数据结构终止阵列。在一个实施例中,文件终结符308可被实现为标头304-b,头304-b具有有效的签名,设置为0 (0)的流大小和设置为GUID_NULL的服务标识符。同样可使用其他文件终结符。一旦被创建了,存储器映射文件在注册进程中保持打开,且每个记录302-a被存储在全局列表中,其维护系统对象句柄124 (例如,HWND)、应用对象接口 114 (例如,接口标识符)和标识记录302-a的文件映射句柄之间的映射。这个全局列表可存储在线程本地存储(TLS)隙中并因此是每个线程的。文件映射句柄仅对发起进程有意义并在去注册接口时使用。图4A例示了适合于使用IPC系统100的用户接口视图400。如图4A所示,用户接口视图400例示了代表应用对象112的多个应用对象402-d。假定应用对象402-d中的每一个对应于与应用程序110类似的不同应用程序,并被布置为对应的应用程序呈现用户接口 406-f。进一步假定应用对象402-d中的每一个使用IPC组件130与对应的系统对象 404-e相关联或映射至对应的系统对象404-e。例如,每个系统对象404_e可以是系统对象 122的代表,并可被实现为系统程序120生成的⑶I窗口。在操作中,应用对象402-d中的每一个可进行操作以在系统对象404-e的各个窗口中呈现各个用户接口 406-f。例如,应用对象402-1可在系统对象404-1中呈现用户接口 406-1,且应用对象402-3可在系统对象406-3中呈现用户接口 406-3。如所示,假定系统对象404-3是比系统对象404-l、404-2. . . 404-e更大的窗口。因为系统对象404-3是初级窗口,而其他系统对象404-1、404-2. . . 404-e是次级窗口,所以这可能发生。如箭头408 指示,当用户接口视图400呈现在电子设备上时,这可以是所期望的,该电子设备具有被设计为允许多个应用程序同时运行,并允许用户在系统对象404-e的初级窗口和次级窗口之间切换应用对象402-d和关联用户接口 406-f的处理系统。用户接口视图400可提供允许控制用户接口视图400 (例如,指针、按钮、手势等)的各种GUI工具。图4B例示了适合于使用IPC系统100的用户接口视图400。图4B例示了当用户从系统对象404-1到系统对象404-3切换应用对象402-1和关联用户接口 406-1时的用户接口视图400,反之亦然。为了完成这个,系统程序120可使用IPC组件130以移除在应用对象402-1和系统对象404-1之间的现存连接,并在应用对象402-1和系统对象404-3之间建立新的连接,反之亦然。替代地,系统程序120可为应用对象402-1生成与系统对象 404-3类似的新的系统对象404-e (例如,系统对象404-5),以替换系统对象404-3。可以参照一个或多个逻辑流进一步描述上述实施例的操作。可预想到的是,除非另有指示,代表逻辑流不必以呈现的顺序或以任何具体的顺序执行。此外,关于逻辑流描述的各种活动可以串行或并行方式执行。如设计或性能约束的给定集合所期望的,可使用所描述的实施例中的一个或多个硬件元件和/或软件元件或替代元件来实现逻辑流。例如, 逻辑流可被实现为由逻辑设备(例如,通用或专用计算机)执行的逻辑(例如,计算机程序指令)。图5例示了逻辑流500的一个实施例。例如,逻辑流500可代表此处描述的一个或多个实施例,诸如IPC组件130的对象关联组件132,执行的一些或所有操作。在图5示出的例示实施例中,在框502处,逻辑流500可创建用于在第一进程中执行的应用程序的应用对象,应用对象具有应用对象接口。例如,应用程序110可创建第一进程104中执行的一个或多个应用对象112,每个应用对象112具有应用对象接口 114。在框504,逻辑流500可启动创建用于在第二进程中执行的系统程序的系统对象, 系统对象具有系统对象句柄。例如,应用程序Iio和/或应用对象112可启动创建用于在第二进程114中执行的系统程序120的系统对象122,系统对象122具有系统对象句柄124。 在一个实施例中,系统对象句柄1 可包括由系统程序120分配的HWND。在框506,逻辑流500可映射应用对象接口和系统对象句柄。例如,应用程序110 和/或应用对象112可调用对象关联组件132以映射应用对象接口 114和系统对象句柄 124。对象关联组件132可允许应用程序110来注册应用对象接口 114和用于应用程序 110 “拥有”的系统对象122上的应用对象112的其他服务。这允许IPC系统100中的其他进程发现和使用注册的接口和服务。应用程序Iio可通过调用注册API以将应用对象接口 114和系统对象句柄124 (例如,HWND)相关联,来公开应用对象112的应用对象接口 114。 一旦这已经完成了,了解系统对象句柄124的任何进程可获取用于在给定情景中使用的应用对象接口 114。在一个实施例中,对象关联组件132可使用COM API集合来执行注册操作。去注册接口本质上逆转注册操作。通过例子的方式,应用程序110可通过具有以下签名的RegisterWindowService (注册窗口服务)API将服务和HWND相关联
STDAPI RegisterWindowService (—in HWND hwnd,
— in REFGUID
serviceld,RegisterWindowService (注册窗口服务)的伪代码如下(为简洁起见而没有错误检
查)
STDAPI RegisterWindowService(—in HWND hwnd,
—in REFGUID serviceld, —in IUnknown 氺punk)
{
wchar_t szFileMappingName[150];
_CreateFileMappingName (hwnd, szFileMappingName, ARRAYSIZE(szFileMappingName)); IStream ^pStream;
CreateStreamOnHGlobal(NULL, TRUE, &pStream); CoMarshalInterface(pStream, —uuidof(punk), punk, MSHCTX—LOCAL, NULL, MSHLFLAGS—TABLESTRONG); HANDLE hMapping;
—AddServiceToFiIeMapping(pStream,
szFileMappiηgName, serviceld,
pSecurityAttributes, &hMapping);
_gHWNDMappingHo1der. AddMapping(hwnd, serviceld, hMapping);
ι
在创建系统对象122期间,应用程序110可初始化适当线程上的COM,并注册应用对象接口 114,如下
int APIENTRY wffinMain (_in HINSTANCE hlnstance,
_in_opt HINSTANCE, —in PWSTR, —in int nCmdShow)
{
if (SUCCEEDED(Colnitialize(NULL)))
{
if (SUCCEEDED (CreateApplicationWindow(hlnstance, nCmdShow)))
{
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg); DispatchMessage(&msg);
ι}
CoUninitialize ();
ι
return O;
ι
LRESULT CALLBACK WndProc(HWND hffnd, UINT message, WPARAM wParam, LPARAM
IParam)
{
switch (message) {
case WM_NCCREATE:
{
IObjectProvider ^pProvider; —CreateObjectProvider(&pProvider); RegisterWindowService(hWnd,
SID—SomeSystemService, pProvider);
ι
break;
应用程序110可使用具有如下签名的QueryWindowService (询问窗口服务)API询问系统程序120的接口
STDAPI QueryWindowService (_in HWND hwnd,
——in REFGUID serviceld, ——in REFIID riid,
—deref—out void
水水ppvObject);
QueryWindowService (询问窗口服务)的伪代码如下
STDAPI QueryWindowService (—in HWND hwnd, ——in REFGUID serviceId,—in
REFIID riid, _deref—out void 氺氺ppvObject)
{
^ppvObject = NULL;
wchar_t szFileMappingName[150];
_CreateFiIeMappingName(hwnd, szFiIeMappingName, ARRAYSIZE(szFileMappingName)); IStream ^pStream;
—GetServiceFromFileMapping(szFileMappingName, serviceId, &pStream); CoUnmarshalInterface(pStream, riid, ppvObject);
ι
在注册操作期间,对象关联组件130可执行COM编组(marshaling)操作,以创建表示映射信息202,306-c的编组COM接口流。编组COM接口流可包括一系列表示编组数据包的字节。例如,编组数据包可包括针对以下信息的这样的数据字段,诸如签名(例如,微软扩展对象线或“MEOW”签名)、一个或多个标志、接口标识符(IID)、CLSID、任选的保留数据、数据字节计数和定制编组数据(例如,定制代理的初始化数据)。同样可使用其他数据字段。编组COM接口流可被作为存储器映射文件134的记录302-a的一部分存储。系统程序120可使用对象发现组件136,以定位存储器映射文件134,定位给定的编组COM接口流,并执行解编组操作以获得用于应用对象接口 114的IID。在框508,逻辑流500可创建用于存储器映射文件的存储器映射文件名。例如,对象关联组件132可创建用于存储器映射文件134的存储器映射文件名204。在一个实施例中,可使用系统对象122的系统对象句柄IM创建存储器映射文件名204。因为没有两个进程可在同时包含同一句柄值,所以系统对象句柄IM提供适合的唯一性级别(特别是为HWND)。因此,利用作为映射文件名204的一部分的HWND确保至少与赋予HWND的类似的唯一性级别。如下示出了适合于以“HWND接口 [HWND] ”形式创建用于存储器映射文件134的存储器映射文件名的应用程序接口(API)的例子
static const wchar_t _gszHwndInterfacePrefix[] = L〃冊NDInterface:〃; HRESULT _CreateFileMappingName (_in HWND hwnd,
—out—ecount(cchName) PWSTR pszName, —in—range(>, 0) unsigned int cchName)
{
wchar_t szGuid[40];
StringFromGUID2(riid, szGuid, ARRAYSIZE(szGuid)); return StringCchPrintf(pszName,
cchName, L"%s%llx",
_gszHwndInterfacePrefix,
reinterpret—cast〈unsigned long long> (hwnd)); 在框510,逻辑流500可在存储器映射文件中存储具有映射信息的记录。例如,对象关联组件132可在存储器映射文件134中存储具有映射信息306-c的记录302_a。继续先前的COM例子,在应用对象接口 114注册期间,系统对象句柄IM或HWND 被验证为属于调用进程,其在此处是应用程序110。然后,因为HWND在机器之间没有意义,所以将使用指示本地机器用途的CoMarshal Interface方法将应用对象接口 114编组为编组COM接口流(例如,IMream)。然后,将存储在编组COM接口流中的编组信息保存在存储器映射文件134中。存储器映射文件134的存储器映射文件名204将是由 CreateFlieMappingName (创建文件映射名)方法返回的同一标识符。这使其他进程能读取编组信息。然后,存储器映射文件将具有被施加到其的SYSTEM_MANDATORY_LABEL_ACE,指定 SYSTEM_MANDAT0RY_LABEL_N0_READ_UP | SYSTEM_MANDAT0RY_LABEL_N0_WRITE_UP 这将确保以低于调用应用的集成级别运行的应用将不能访问注册到高集成级别应用的接口。取决于与窗口相关联的服务的数目,存储器映射文件134将典型地包含多于一个编组COM接口流。如参照图3所述,存储器映射文件134本质上包含编组COM接口流的阵列。维护这个映射的类的定义的例子如下
class CHWNDMap
{
CHWNDMap () _tlsSlot (TlsAlloc ())
{
}
HRESULT AddMapping(—in HWND const hwnd, —in REFGUID serviceld,— in HANDLE const hMapping) const;
HRESULT RemoveAll (—in HWND const hwnd) const;
HRESULT RemoveMapping(—in HWND const hwnd, —in REFGUID serviceld, HANDLE ^phFileMapping) const;
struct HWND_FILEMAPPING
{
HWND const_hwnd;
GUID_serviceld;
HANDLE const _hFiIeMapping;
};
DWORD const _tlsSlot;
};
图6例示了逻辑流600的一个实施例。例如,逻辑流600可代表由此处描述的一个或多个实施例,诸如IPC组件130的对象发现组件136,执行的一些或所有操作。在图6示出的例示实施例中,在框602,逻辑流600可接收用于应用对象的服务请求。例如,对象发现组件136可接收针对应用对象112的服务请求210 (例如,API调用)。在框604,逻辑流600可确定用于系统对象的系统对象句柄。例如,对象发现组件 136可确定用于系统对象122的系统对象句柄124。对象发现组件136可使用将系统对象句柄1 分配给系统对象122的系统程序120所提供的信息,确定系统对象句柄124。在框606,逻辑流600可使用系统对象句柄创建用于存储器映射文件的存储器映射文件名。例如,对象发现组件136可使用系统对象句柄IM创建(或重新创建)用于存储器映射文件134的存储器映射文件名204。在框608,逻辑流600可从存储器映射文件取得具有映射信息的记录,映射信息表示在用于第一进程中执行的应用程序的应用对象的应用对象接口和用于第二进程中执行的系统程序的系统对象的系统对象句柄之间的映射。例如,对象发现组件136可从存储器映射文件134取得具有映射信息306-c的记录302-a。映射信息306_c可表示在用于第一进程104中执行的应用程序110的应用对象112的应用对象接口 114和用于第二进程114 中执行的系统程序120的系统对象122的系统对象句柄IM之间的映射。继续以前图5的例子,对象发现组件136可使用与由对象关联组件132使用来初始创建存储器映射文件名204相同的CreateFileMappingName (创建文件映射名)方法来构造存储器映射文件名204 (和IID)。对象发现组件136可定位存储器映射文件名,并使用IID将来自存储器映射文件134的编组信息重组在IStream中。应用对象接口 114使用 CoUmarshalInterface API 来解编组。在异常应用终止的情况下,IPC组件130可被布置为确保正确地清除OS资源。例如,当进程终止且到存储器映射文件134的最后句柄被关闭时,内核(kernel)将正确地清除存储器映射文件134。这些API的实现方式仅保持存储器映射文件134打开足够久以读取来自存储器映射文件134的数据并将其放入IMream。可使用COM操作清除在异常应用终止之后留下的任何代理/存根(stub)。如果另一进程正在保持到因为应用终止而不再可用的对象的代理,则它将开始接收指示对象已不在的RPC错误。如果应用未能调用去注册操作,则维护在HWND、服务标识符和文件映射句柄之间的映射的全局列表将被泄露(作为堆泄露),但是,当应用终止时,其可由OS再生(reclaim)。总体上由IPC系统100 (具体地由IPC组件130)实现的增强的IPC技术提供了优于传统的IPC技术的各种优势。例如,增强的IPC技术使应用能通知在HWND级的接口和服务。在另一例子中,增强的IPC技术使应用能动态地在运行时间移除或改变接口和服务的通知。在再一例子中,增强的IPC技术允许资源回收。在再一例子中,增强的IPC技术适应较差的应用设计。在再一例子中,增强的IPC技术允许这样的情景,其中如果应用正常终止 (未崩溃)但是应用未能正常释放资源,则由这个特征分配的资源可由操作系统再生。在再一例子中,增强的IPC技术适应应用崩溃。在再一例子中,增强的IPC技术允许这样的情景, 其中如果应用异常终止,则操作系统应清除HWND接口约定(contract)。最后,增强的IPC 技术提供管理安全性的能力。这些仅是例子,且增强的IPC技术也提供其他优势。图7例示了适合于实现前述的各种实施例的示例计算体系架构700的实施例。计算体系架构700包括各种普通的计算元件,诸如一个或多个处理器、协处理器、存储器单元、芯片组、控制器、外围设备、接口、振荡器、定时设备、视频卡、音频卡、多媒体输入/输出 (I/O)组件等等。然而,实施例不限于由计算体系架构700的实现方式。如图7所示,计算体系架构700包括处理单元704、系统存储器706和系统总线 708。处理单元704可以是各种商业可得的处理器中的任何一种。双微处理器和其他多处理器架构也可被采用为处理单元704。系统总线708为包括但不限于系统存储器706的系统组件提供至处理单元704的接口。系统总线708可以是一些类型的总线结构中的任何一种,其还可使用各种商业可得的总线体系架构中的任何一种与存储器总线(具有或没有存储器控制器)、外围总线和本地总线互连。系统存储器706可包括各种类型的存储器单元,诸如只读存储器(ROM)、随机存取存储器(RAM)、动态RAM (DRAM)、双倍数据速率DRAM (DDRAM)、同步DRAM (SDRAM)、静态RAM (SRAM)、可编程ROM (PROM)、可擦除可编程ROM (EPR0M)、电可擦除可编程ROM (EEPR0M)、 闪存、诸如铁电聚合物存储器的聚合物存储器、双向存储器、相变或铁电存储器、硅-氧化物-氮化物-氧化物-硅(S0N0S)存储器、磁或光学卡、或适合于存储信息的任何其他类型的介质。在图7示出的例示实施例中,系统存储器706可包括非易失性存储器710和/或易失性存储器712。基本输入/输出系统(BIOS)可被存储在非易失性存储器710中。计算机702可包括各种类型的计算机可读存储介质,包括内部硬盘驱动器(HDD) 714、磁软盘驱动器(FDD)716以从可移除磁盘718读取或写入可移除磁盘718、以及光盘驱动器720以从可移除光盘722读取或写入可移除光盘722(例如,⑶-ROM或DVD)。HDD714、FDD716和光盘驱动器720可由HDD接口 724、FDD接口 7 和光驱动器接口 7 分别连接至系统总线708。用于外围驱动器实现方式的HDD接口 7 可包括通用串行总线(USB)和 IEEE1395接口技术中的至少一个或两者。驱动器和相关联的计算机可读介质提供数据、数据结构、计算机可执行指令等等的易失性和/或非易失性存储。例如,多个程序模块可被存储在驱动器或存储器单元710、 712中,这包括操作系统730、一个或多个应用程序732、其他程序模块734和程序数据736。 例如,一个或多个应用程序732、其他程序模块734和程序数据736可包括IPC系统100、应用程序110、系统程序120、IPC组件130、对象关联组件132、存储器映射文件134和对象发现组件136等等。用户可通过一个或多个有线/无线输入设备(例如,键盘738和诸如鼠标740的指示设备)在计算机702中键入命令和信息。其他输入设备可包括麦克风、红外(IR)远程控制、控制杆、游戏板、输入笔、触摸屏等。这些或其他输入设备经常通过输入设备接口 742(耦连至系统总线708,但也可由其他接口诸如并行端口、IEEE1394串行端口、游戏端口、USB端口、顶接口等等连接)连接至处理单元704。监视器744或其他类型的显示设备也经由诸如视频适配器746的接口连接至系统总线708。除监视器744外,计算机典型地包括诸如扬声器、打印机等等的其他外围输出设备。计算机702可使用经由有线和/或无线通信至一个或多个远程计算机(诸如远程计算机748)的逻辑连接在网络环境中操作。远程计算机748可以是工作站、服务器计算机、 路由器、个人计算机、便携式计算机、基于微处理器的娱乐家用电器、对等设备或其他普通的网络节点,并典型地包括关于计算机702描述的许多或所有元件(尽管为了简洁的目的, 仅例示了存储器/存储设备750)。所描绘的逻辑连接包括至局域网(LAN)752和/或更大的网络(例如,广域网(WAN)754)的有线/无线连接性。这样的LAN和WAN网络环境是办公室和公司中的普通事物,并促进诸如内联网的企业范围的计算机网络,所有这些可连接至全球通信网络(例如,因特网)。当在LAN网络环境中使用时,通过有线和/或无线通信网络接口或适配器756将计算机702连接至LAN 752。适配器756可便于至LAN 752的有线/无线通信,其还可包括其上布置的用于与适配器756的无线功能进行通信的无线接入点。当在WAN网络环境中使用时,计算机702可包括调制解调器758,或被连接至WAN 7 上的通信服务器,或具有用于通过WAN 754 (诸如通过因特网的方式)建立通信的其他手段。调制解调器758,其可以是内部的或外部的和有线和/或无线设备,经由输入设备接口 742连接至系统总线708。在网络环境中,涉及计算机702描述的程序模块或其部分可被存储在远程存储器/存储设备750中。将预想到,示出的网络连接是示例性的,而且可以使用在计算机之间建立通信链接的其他手段。计算机702可操作为使用IEEE 802标准族与有线和无线设备或实体进行通信,诸如操作性地布置在与例如打印机、扫描仪、台式和/或便携式计算机、个人数字助理(PDA)、 通信卫星,任何与无线地可检测的标签(例如,公用电话间(kiosk)、报摊、休息室)相关联的设备或位置和电话进行无线通信(例如,IEEE 802. 11空中调制技术)中的无线设备。这包括至少Wi-Fi(或无线保真)、WiMax和Bluetooth 无线技术。因此,通信可以是如同传统网
1络的预定义结构或简单地在至少两个设备之间的ad hoc通信。Wi-Fi网络使用被称为IEEE 802. Ilx (a、b、g等)的无线电技术提供安全、可靠、快速的无线连接性。Wi-Fi网络可被用于连接计算机至彼此、至因特网及至有线网络(其使用IEEE 802. 3-相关的介质和功能)。可使用硬件元件、软件元件或其组合实现各种实施例。硬件元件的例子可包括设备、组件、处理器、微处理器、电路、电路元件(例如,晶体管、电阻器、电容器、电感器等等)、 集成电路、专用集成电路(ASIC)、可编程逻辑设备(PLD),数字信号处理器(DSP)、现场可编程门阵列(FPGA)、存储器单元、逻辑门、寄存器、半导体器件、芯片、微芯片、芯片组等等。软件元件的例子可包括软件组件、程序、应用、计算机程序、应用程序、系统程序、机器程序、操作系统软件、中间件、固件、软件模块、例程、子例程、函数、方法、过程、软件接口、应用程序接口(API)、指令集、计算代码、计算机代码、代码片段、计算机代码片段、字、值、符号或其组合。如给定的实现方式所期望的,确定是否使用硬件元件和/或软件元件实现实施例可根据任何数目的因素(诸如期望的计算速率、功率级别、热容忍度、处理周期预算、输入数据速率、输出数据速率、存储器资源、数据总线速度和其他设计或性能约束)而不同。一些实施例可包括制品。制品可包括用来存储逻辑的存储介质。存储介质的例子可包括能够存储电子数据的一种或多种计算机可读存储介质,包括易失性存储器或非易失性存储器,可移除或不可移除存储器,可擦除或不可擦除存储器,可写或不可写存储器等。 逻辑的例子可包括各种软件元件,诸如软件组件、程序、应用、计算机程序、应用程序、系统程序、机器程序、操作系统软件、中间件、固件、软件模块、例程、子例程、函数、方法、过程、软件接口、应用程序接口(API)、指令集、计算代码、计算机代码、代码片段、计算机代码片段、 字、值、符号或其任意组合。例如,在一个实施例中,制品可存储可执行计算机程序指令,其在被计算机执行时,使得计算机根据描述的实施例执行方法和/或操作。可执行计算机程序指令可包括任何适合的类型的代码(诸如源代码、编译代码、解释代码、可执行代码、静态代码、动态代码等)。可根据预定义计算机语言、方式或句法实现可执行计算机程序指令,用于指示计算机执行某一功能。可使用任何适合的高级、低级、面向对象的、虚拟的、编译的和 /或解释编程语言实现指令。可使用表达“一个实施例”或“实施例”及其导出物描述一些实施例。这些术语意指结合被包括在至少一个实施例中的实施例描述的具体的特征、结构或特性。在本说明书中的各种地方的短语“在一个实施例”的出现不必全部指向同一实施例。可使用表达“耦连”和“连接”及其导出物描述一些实施例。这些术语不必意图为彼此的同义词。例如,使用术语“连接”和/或“耦连”描述一些实施例以指示彼此直接物理或电接触的两个或多个元件。然而,术语“耦连”还可意指两个或多个元件不彼此直接接触,但仍彼此协作或交互。需要强调的是,提供了本公开的摘以符合37 C. F. R Section 1.72(b),其要求将允许读者快速确定技术公开的性质的摘要。它被提交为具有以下理解它将不被用于解释或限制权利要求的范围或意义。此外,在前述具体实施方式
中,可看到,为了使得本公开流畅的目的,在单个实施例中一起集合了各个特征。这种公开的方法不应被解释为反映所要求的实施例需要比每个权利要求中明确引用的特征更多的特征的意图。相反,如以下权利要求所反映的,本发明主题在于比单个所公开的实施例的所有特征更少的特征。因此,以下权利要求在此被合并到具体实施方式
中,每个权利要求本身作为单独的实施例。在所附权利要求中,术语“包括”和“其中”被分别用作相应术语“包含”和“其中”的直接英语等价物。此外,术语“第一”、“第二”、“第三”等仅仅被用作标记,而不意图对它们的对象强加序号要求。 尽管已经以特定于结构特征和/或方法动作的语言描述了本主题,但将理解,在所附权利要求中定义的主题不必限于上述特定特征或动作。相反,上述特定特征和动作被公开为实现权利要求的示例形式。
权利要求
1.一种计算机实现的方法,包括创建用于第一进程中执行的应用程序的应用对象,所述应用对象具有应用对象接口 ;启动创建用于第二进程中执行的系统程序的系统对象,所述系统对象具有系统对象句柄;映射所述应用对象接口和所述系统对象句柄;创建用于存储器映射文件的存储器映射文件名;以及在所述存储器映射文件中存储具有所述映射信息的记录。
2.如权利要求1所述的计算机实现的方法,包括将所述存储器映射文件名创建为能由所述应用程序和所述系统程序两者创建的唯一值。
3.如权利要求1所述的计算机实现的方法,包括使用所述系统对象句柄创建所述存储器映射文件名。
4.如权利要求1所述的计算机实现的方法,包括使用被布置为接收所述系统对象句柄作为输入并输出所述存储器映射文件名的应用程序接口来创建所述存储器映射文件名。
5.如权利要求1所述的计算机实现的方法,包括创建用于所述映射信息的标头。
6.如权利要求1所述的计算机实现的方法,包括创建用于所述映射信息的标头,所述标头包括签名、所述映射信息的大小和服务标识符。
7.如权利要求1所述的计算机实现的方法,包括在所述存储器映射文件中存储具有在所述映射信息之前的标头的记录。
8.如权利要求1所述的计算机实现的方法,包括在所述存储器映射文件中存储具有映射信息的第二记录。
9.如权利要求1所述的计算机实现的方法,在所述存储器映射文件中存储具有终结符的第三记录。
10.一种包括存储介质的产品,所述存储介质包含指令,当其被执行时使得系统能实现如权利要求1-9中任一个所述的方法。
11.一种设备,包括处理器(102);以及与所述处理器通信性地耦连的存储器(106),所述存储器存储具有对象关联组件 (132)的进程间通信组件(130),所述对象关联组件在由处理器执行时,可操作来生成映射信息(202)、创建用于存储器映射文件(134)的存储器映射文件名(204),并在所述存储器映射文件中存储具有所述映射信息的记录(302),所述映射信息表示用于第一进程(104) 中执行的应用程序(110)的应用对象(112)的应用对象接口(114)和用于第二进程(114) 中执行的系统程序(120)的系统对象(122)的系统对象句柄(124)之间的映射。
12.如权利要求11所述的设备,包括对象发现组件(136),其可操作来接收服务请求 (210),确定系统对象句柄,使用所述系统对象句柄创建用于所述存储器映射文件的存储器映射文件名,并从所述存储器映射文件取得具有映射信息的记录。
13.如权利要求11所述的设备,包括对象发现组件,其可操作来使用来自映射信息的应用接口标识符(IID)在所述应用对象和系统对象之间建立消息连接。
14.如权利要求11所述的设备,所述存储器映射文件存储具有用于映射信息的标头的记录,所述标头包括签名、映射信息的大小和服务标识符。
15.如权利要求11所述的设备,所述存储器映射文件在存储器映射文件中存储文件终结符(308),以指示所述存储器映射文件的结束。
全文摘要
描述了用于发现对象接口的技术。对象关联组件可操作来生成映射信息,其表示用于第一进程中执行的应用程序的应用对象的应用对象接口和用于第二进程中执行的系统程序的系统对象的系统对象句柄之间的映射,创建用于存储器映射文件的存储器映射文件名,并在存储器映射文件中存储具有映射信息的记录。描述并要求保护其他实施例。
文档编号G06F9/44GK102541543SQ201110429179
公开日2012年7月4日 申请日期2011年12月20日 优先权日2010年12月20日
发明者C.古扎克, D.乔治夫, G.德贝克 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1