CN1318956C - 软件构件插件程序结构的系统和方法 - Google Patents
软件构件插件程序结构的系统和方法 Download PDFInfo
- Publication number
- CN1318956C CN1318956C CNB028136012A CN02813601A CN1318956C CN 1318956 C CN1318956 C CN 1318956C CN B028136012 A CNB028136012 A CN B028136012A CN 02813601 A CN02813601 A CN 02813601A CN 1318956 C CN1318956 C CN 1318956C
- Authority
- CN
- China
- Prior art keywords
- interface
- specific implementation
- plug
- pif
- card program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Lifetime
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44521—Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
- G06F9/44526—Plug-ins; Add-ons
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明提供软件组件插件程序框架(200)。所描述的系统支持动态加载、例示和卸载接口具体实现(插件程序模块)(204,205)以及封装这些接口具体实现(204、205)。由本发明提供的许多好处包括软件再用、互用性和快速产品开发周期。
Description
版权注意
本发明的一部分公开内容包含属于版权保护的材料。该版权拥有者不反对由任何人传真再现专利文献或专利公开内容,当其出现在专利商标局专利文件或记录中,然而在其他方面却保留所有版权。
优先权
本申请要求2001年5月30日提交的名为“SYSTEM AND METHOD FORSOFTWARE COMPONENT PLUG-IN FRAMEWORK”的临时专利申请No.60/294,467以及2001年7月31日提交的,名为“SYSTEM AND METHOD FOR SOFTWARECOMPONENT PLUG-IN FRAMEWORK”的实用专利申请的优先权,其内容在此引入以供参考。
技术领域
本发明通常涉及对象组件模型,以及更具体地说,涉及用于允许框架体系结构中的插件应用程序的系统和方法。
背景技术
当今的企业环境已经变得越来越依赖于电子商务或“电子商务”应用,用于他们的每天操作。电子商务应用通常将这些企业广义的功能定义为购买、销售、金融、制造、企业资源计划和数据处理的供应链管理。电子商务应用通常设计成在通称为电子商务或事务处理器的专用计算机服务器或一组服务器上操作或运行。这些服务器产品包括来自from BEA Systems,Inc.,SanJose,California的TUXEDOTM产品;同样来自BEA Systems的WeblogicServerTM;来自Microsoft Corporation in Redmond,Washington的CommerceServerTM;以及来自IBM Corporation,Armonk,New York的AvilaTM和CRMTM。
用于这些服务器的密钥要求是它们能被证明、可靠和可升级以便满足成长组织的需要。一些产品在设计方面也很注意灵活性。特别地,TUXEDO适合提供能用来连接和授权所有用户,同时合并所有公司全体数据的强大和灵活的端对端电子商务解决方案。
这种电子商务或事务服务器的一个主要的缺点在于他们本身倾向于非常大的应用。典型的电子商务服务器充当必须编译以便形成引擎或核心的服务器应用,然后,客户应用可以通过引擎或核心通信。只要编译过,很少能增加或修改服务器应用,因此,对系统来说,不必要求重构该核心。
图1表示当将其应用到电子商务应用上时的传统的核心编译过程。如在此所示,典型的电子商务服务器最初具有或不具有“个性化(personality)”。如在此所使用的,术语“个性化”用来指用户(客户)应用将与其交互作用的特殊应用前端,并包括诸如AMS、Jolt和TUZEDO的个性化。个性化经下文称为“姿态(attitude)”的各种编程原理与外部世界(即,客户应用)通信。姿态包括例如,Java、C、C++、Cobol和OLE(对象链接和嵌入)。类似地,电子商务服务器可以装有由电子商务服务器使用但不是直接编程为客户应用的很少或没有扩展应用、附加应用,以及在一些情况下,甚至可以不与外部世界交互作用。扩展应用能被视为能用来增加服务器的标准特征的有用的实用功能。
传统上,为增加个性化或扩展,在每一步骤,必须重构和重新编译服务器核心。这使得服务器停工期成为必要并且大大地增加在重新编译过程期间或在最短的可能时间中再次运行服务器的尝试期间,将引入错误的风险。如图1所示,切换到TUXEDO个性化、增加连接模块扩展,然后增加安全性模块扩展可以采用三个一样多的服务器停工期和核心重新编译。当增加例程服务器应用更新和软件修补时,也会遇到这些编译问题。当替换服务器核心本身时,传统的服务器体系结构同样不适合于再使用模块代码。花费许多的时间和成本来重写用于大多数与代码的最后一个版本相同的服务器产品的新版本。开发顾客代码以便与他们的服务器产品一起运行或在它们的服务器产品内运行的顾客找出不能与服务器产品的服务器版本一起使用的他们的代码。全部结果是冗余编码、费用和浪费时间的一个。
发明内容
为解决这一问题,发明人已经断定将现有的应用事务服务器或电子商务服务器分成一组更可管理的部分是很有利的。这也解决了下述目的:
允许商务和事务服务器顾客以便用更新或未来的服务器产品再用它们的客户应用。
由于当前提供的服务器体系结构的改变,消除了端口和换发其他、相关的基于服务器的产品的另外的步骤。
因为他们的基于服务器的产品包括在服务器系统的最新版本中校正过的故障,解决了顾客遇到的电子商务服务器的需要。
通过“组件化”降低复制/改变过的产品的代码量,并促使再用软件代码以便最小化冗余编码。
因此,为解决这些目的,发明人提出了一种电子商务服务器体系结构,其中在此称为“引擎”的服务器引擎组件在提供一些基本服务以及允许用户化引擎的插件机制中起主要作用。这一用户化可以包括引擎的良好定义的接口,以及来自引擎的调出指令。通过插件模块提供用户化,包括扩展的引擎集的任何用户化。
在服务器引擎中,插件模块(在此称为接口具体实现)的动态链接和加载以及那个接口具体实现的封装以下述方式发生,即、全部由接口用户隐藏所述接口具体实现(即,充当客户或客户应用的组件)。
如在此所述,发明人提供可以插入或作为应用服务器引擎一部分以便根据通过插件模块扩展它们从而允许引擎接口的动态用户化的插件构架。反过来通过个性化和引擎扩展提供这些插件模块。可以与本发明一起使用的应用服务器引擎包括电子商务事务和应用引擎。引擎插件构架的一个实施例提供下述特征:
形式插件程序模块综合模型;
用于动态加载、链接和卸载插件程序模块的公用基础设施;
用于插件程序模块的公用登记机制;以及
充当提供接口的引擎的扩展的插件程序应用编程接口(APIs)。
通过框架体系结构的各个实施例,可以支持用于插件程序模块的DLL(动态链接库)和非DLL类型的容器。包括这一新的体系结构的系统能通过客户-服务器关系,被虚拟化为彼此交互作用的软件组件库。如在此所使用的,软件组件当其请求由另一组件提供的服务时被视为“客户”,以及当其提供由另一组件请求的服务时,被视为“服务器”。组件能通过相应的接口提供多组互联或非互联(即,彼此独立)服务。到客户来说,组件因而似乎是一组接口。客户不关心这些接口如何由组件来真正实现。由此,在本申请的该上下文中使用的组件是与给定它们所支持的一组接口相关的具体实现提供者。只要新组件能够提供用于与旧组件所做相同的接口的具体实现,组件就能从应用中去除或用另一组件代替,
当实现这种接口体系结构时,涉及组件使用的一个早期设计决定是决定在媒介或容器上制造运行时间期间可用的组件。应当有用于由每个用户调用的接口的后备具体实现。如果该需求是用于将客户机与接口具体实现分开,这一具体实现库能是可动态链接的,如果该需求是直到真正需要时才加载该组件的话,可以动态加载。在相同(例如,本地)节点或远程节点上,该库可以是另一处理。
附图说明
图1是现有技术服务器结构过程的示例说明;
图2是根据本发明的实施例,示例说明引擎的替换的构架系统结构体系的示意图;
图3是根据本发明的实施例的组件的示意图;
图4是根据本发明的实施例的组件接口的示意图;
图5是根据本发明的实施例的接口具体实现的流程图;
图6是根据本发明的实施例的插件程序具体实现的示意图;
图7是根据本发明的实施例的导出的插件程序或具体实现继承的示意图;
图8是根据本发明的实施例的扇出(fanout)类型拦截(interception)的示意图;
图9是根据本发明的实施例的堆栈类型拦截的示意图;
图10是根据本发明的实施例,具有扇出具体实现的接口的具体实现的示意图;
图11是根据本发明的实施例,具有堆栈具体实现的接口的具体实现的示意图;
图12是根据本发明的实施例,实现过程的流程图;
图13是根据本发明的实施例,接口规格过程的流程图。
具体实施方式
以下包括术语、首字母缩写词和缩写的简单词汇,将有助于理解下面的
实施例的详细描述:
引擎-共同、个性化独立的服务的集合(例如,通信、负载平衡、路由、基本安全、基本mgmt)。当用在本申请的上下文中时,术语“引擎”与词核心同义。
个性化-编程模型支持(包括对引擎和环境的映象),例如,API映象和个性化特定的功能。
姿态-用于编程模型的程序接口。
扩展-用于连接第三方产品/与第三方产品一起使用的专用服务。
接口-有关服务的请求者(客户)和提供者(服务器)间的一组服务的契约(contract)。这一契约指定具有相关的语法和语义属性的一组功能(例如输入/输出参数或返回值)。不过,在接口内的服务通常不一定相关。
接口ID(盖)-用于接口规定的唯一标识符或ID。
具体实现-实现由特定接口指定的服务的一组软件模块。
具体实现ID(ImpIID)-用于接口具体实现的唯一标识符或ID。这一ID在与特定接口有关的所有注册的接口具体实现中是唯一的。
接口具体实现-例示接口具体实现和将指针传递给它以便以后由客户参考的过程。
组件-绑在一起的一组软件模块,并提供用于一组接口的具体实现。
插件程序-用于特定接口的具体实现。
插件程序构架(PIF)-如由本发明使用来接受插件程序的引擎插件程序构架组件。
记录-用于存储PIF有关的信息的永久存储数据存储库。
动态链接库(DLL)-用于组件的级任服务器、或容器。DLLs通常与所链接的客户应用程序共享相同的地址空间。在一些平台(例如UNIX)上,容器是共享的对象,因为在使用的所有过程中,其正文段仅加载一次并共享。
容器-用于分布插件程序的媒介。例如,DLL可以充当容器。
虚拟功能表(Vtable或Vtbl)-用于指向组成相关接口的功能的不同具体实现的指针的数组。
pVtable-到Vtable的指针。
导出具体实现(合成插件程序,导出插件程序)-继承来自那个接口的其他具体实现的接口的一些方法的具体实现的接口具体实现(换句话说,其实现那个接口的其他具体实现或与那个接口的其他具体实现有关)。
单态插件程序-仅能具有单态实例的插件程序。
文献惯例-在这一文献的下述部分中,下述惯例应用在所示的例子中:
[...]表示可选项。
<...>表示能由符合所指定的语法的具体实现值代替的令牌。<and>之间的值通常用插件程序指定名来代替,以便检索插件程序指定的功能。
图2表示根据本发明的实施例的系统体系结构的示意图。如图2所示,本发明提供动态可构造的插件程序引擎,其依次是较大的插件程序构架200(下文称为PIF)的一部分。在一个实施例中,PIF200包括引擎201、以及不同的插件程序个性化和插件程序扩展。这些构架组件允许客户应用程序以对调用服务的应用程序来说透明的方式访问服务。能与本发明一起使用的个性化202包括诸如TUXEDO、Jolt和AMS的系统。这些个性化允许客户应用206经一组编程语言或姿态208与引擎交互作用。姿态包括例如由TUXEDO个性化提供的C、OLE和Cobol姿态。将个性化插入引擎中作为客户所需服务的一系列组件。通常称为扩展(extension)204的专用插件程序可以类似地插入构架中,例如充当一系列或一组专用服务205的管理器或接口。
如所示,PIF允许具体实现和支持组件模型体系结构,其中:
组件是捆在一起的一组软件模块,并提供用于由相应的接口指定的一组服务的具体实现。
接口是有关服务的请求者(客户)和提供者(服务器)之间的一组服务的契约。这一契约指定具有相关的句法和语义属性,例如输入/输出参数和返回值等等的一组功能。组件利用客户/服务器关系并通过接口彼此通信。
通过这一体系结构,引擎20能进一步形象化为通过客户-服务器关系,彼此交互作用的软件组件库,如图3所示。组件212当其调用由另一组件提供的服务220、224时,被视为客户机,以及当其提供由另一组件提供的服务时,将其视为服务器214、215。由每个服务器组件提供的服务集能通过友好的接口216、217访问。服务器组件能通过可以相互关联或不关联(彼此独立的)相应的接口提供多个服务集。
接口是客户机组件和服务器组件的连接点。客户机组件不需要知道如何由服务器组件实现这些接口。换句话说,支持接口的服务器组件对客户机组件来说完全是透明的。这表示在运行时,能通过其他插件程序来代替接口216的具体实现221、222(插件程序),而不与客户应用程序代码冲突。
对客户机来说,接口可以是例如C语言数据类型结构,其每个成员是指向实现由相应的接口定义的服务的插件程序功能的功能指针。因此,接口仅是一组服务的形式规格直到注册以及随后实现它(及其相应的具体实现或插件程序)为止。同样地,接口必须在能调用其服务前实现。接口具体实现过程包括定位指定的具体实现、将其加载到调用程序的地址空间,以及用具体实现由相应的接口定义的服务的插件程序功能的地址填充指针的内部表。
接口定义
定义接口的一个方法是使用标准的规格诸如对象管理组(以下称为OMG)的接口定义语言(interface definition language)(以下称为IDL)或其子集。然而,能另外使用支持“结构”、“记录”或具有双间接支持的数据结构的等效类型的其他的语言(例如,用在C或C++中的结构命令)。实际定义接口的方法对理解本发明来说是不必要的并且能留给接口开发商。
然而,希望接口开心人员提供下述软件模块,能由客户链接这些软件模块和/或在运行之前与那个接口的插件程序链接。
头文件:客户应用程序和插件程序均使用头文件来定义接口、接口功能的功能模型以及用于调用各种接口功能的宏。这些头文件包括到客户应用程序和插件程序的源代码中。
客户遗留文件(stub file):客户应用程序使用用于调用接口功能的客户遗留文件。客户遗留将接口定义为一组语言特定的数据类型和例程,一个用于接口的一部分的每个功能(方法)。这些客户遗留文件被编译并链接到客户应用程序中。
插件程序框架文件:插件程序使用插件程序框架文件来将接口功能的客户调用映象到接口具体实现(即插件程序)中的真正功能具体实现上。
接口特性(interface identity)
在本发明的一个实施例中,每个接口具有用作使用那个接口的编码中的编译时间类型。在由接口开发商提供的头文件中定义这些程序类型。
用于接口的程序名仅仅是在应用程序源代码中使用的编译时间类型。每个接口还具有唯一运动 时间标识符<接口ID>,具有下述语法:
<interface id>:=<component name>[/<sub-component name>]/<interface
name>
其中:<component name>:= <an alphabetic characteror′_′character><string of alpha-numeric characters &′_′character;
<subcomponent name>:=<string of alpha-numeric characters&′_′>;以及
<interface name>:= <strng of alpha-numericcha racters &′_′>.
对本领域的技术人员来说在此给出的特定的变量名和语法是用于示例目的,以及本发明不限于在此描述的特定语法是很显然的。
根据一个实施例,有一个通用的名称空间,用于记录引擎PIF中的<interface id>。每个<interface id>在这一名称空间中是唯一的。除<interface id>外,每个接口还可以具有与其有关的、按两个数字指定的版本,<major version number>和<minor version number>。<interface id>与版本的结合唯一地标识接口的特定版本。
使用版本来表示接口间,特别地相同接口的版本间的兼容性。<majorversion number>变化意指不同的接口。不期望接口的不同主要版本彼此兼容。然而,接口相同的<major version number>,但不同<minor versionnumber>在具有较高<minor version number>的版本应当向下与具有较低<minor version number>的版本兼容的意义上应当兼容。<major versionnumber>和<minor version number>能用表示0和256间的数字的数字串给出。
每个引擎的个性化以及扩展具有唯一的<component name>。<interfacename>在拥有它的组件内应当是唯一的。组件提供者(可以是第三方卖主或开发商)负责向他们提供的接口指定<interface name>、<major versionnumber>和<minor version number>。
具体实现特性(implementation identity)
根据本发明的实施例,所支持的接口的每个具体实现相对于其具体实现的接口具有唯一具体实现ID(jmplid)。这一具体实现ID具有下述语法:
<implid>:=<′component name>[/<sub-component name>]/<impl name>
其中:
<component name>:=<an alphabetic character or′_′character><string of alpha-numeric characters &′_′>;
<subcomponent name>:=<string of alpha-numeric characters&′_′>;
<impl name>:=<string of alpha-numeric characters &′_′>;以及
<component name>是来自一组预订卖主IDs的指定卖主名。
有一个通用的名称空间,用于记录引擎PI F中的<impl id>。每个<implid>是这一名称空间内是唯一的。
版本控制
接口版本兼容性是由特定调用程序请求或调用的接口与支持或实现接口的接口具体实现或插件程序间的重要问题。根据本发明的一个实施例,每个接口具有能根据主次版本号指定的版本号。插件程序是接口的特定版本的具体实现。下述规则适合实现过程期间关于所实现的接口和视为支持接口的插件程序间的版本兼容(_e_pif_realize()功能的处理)。
每个插件程序具有其提供具体实现的接口的版本的运行时间知识。如果调用程序试图实现的接口的主版本号以及特定插件程序实现的接口的主版本号不同,那么接口和插件程序不兼容以及在这种情况下,接口的实现失败。
如果调用程序正试图实现的接口的主版本号以及插件程序特定的实现的接口的主版本号相同,那么下述的规则子集适合:
具有较高次版本号的接口与具有较低次版本号以及相同的<interfaceid>的接口向下兼容(根据功能性和功能特征)。
具有较低次版本号和相同<interface id>的接口是具有较高次版本号的接口。
在实现过程期间,支持插件程序(即,具体实现接口的插件程序)必须具有等于或高于正具体实现的接口的次版本号的次版本号。否则,接口和插件程序是不兼容的。
根据具有具体实现相同接口,但具有较低次版本号的插件程序的Vtbl的大小和内容,允许由实现具有较高次版本号的接口的插件程序返回的Vtbl仅以向下兼容的方式增长。在此使用的术语Vtbl采用其公用意义并且是本领域公知的术语。
给出如上所述的规则以便示例说明本发明的特定的实施例,特别是在那个实施例中使用的版本号。其他的规则能代替或增加到如上所示的规则同时仍然在本发明的精神和范围内对本领域的技术人员来说是很显然的。
插件程序配置文件
PIF配置文件在运行时间期间,提供将PIF客户(PIF外部接口功能的调用程序,不管其是应用过程还是系统过程)与一组PIF相关的属性关联的方法。PIF客户可以想使用其自己的具体实现用于特定的接口,或其可以想实现不同的具体实现。
PIF配置文件由称为<profile id>唯一简档标识符识别。<profile id>的语法指定如下。
<profile id>:=<a character string consists of alpha numericcharacters and_character>。
有用于引擎PIF中的<profile id>的一个通用名称空间。每个<profileid>在这一名称空间中是唯一的。能构造PIF以便在其搜索缺省整个系统的配置文件之前,允许搜索由<interface id>或<impl id>中的EV_PIF_PROFILE环境变量指定的配置文件<profile id>。一组客户可以与相同的配置文件关联,因此,涉及相同组的接口/具体实现对象属性。PIF客户可以通过向所需的<profile id>设置EV_PIF_PROFILE环境变量,与现有的PIF配置文件关联。
PIF记录
PIF需要定位能是DLL(包含指定的插件程序)的所需插件程序容器,以便将其加载到记录中,因此,其需要知道其图象路径以及有关接口及其涉及的接口具体实现的其他属性。为实现此,本发明的实施例使用用于存储这种信息的基于永久存储的数据库。PIF不需要用于基于永久存储的插件程序有关的信息的特定结构。相反,PIF描述这一插件程序信息并指定用于记录和取消记录插件程序和用于查询和/或更新所存储的插件程序信息的一组命令实用程序。在这一文献中,用于存储PIF有关的信息的数据库称为“记录”。在记录中,分别用<interface id>和<impl id>识别接口和接口具体实现。
接口和支持它的具体实现具有相关的属性组。另外,具体实现总是与其实现的接口有关。假定特定的接口,可以有用于那个接口的多种具体实现。接口标识符<interface id>是接口具体实现的属性,识别这一特定接口具体实现实现的接口。具体实现标识符<impl id>是与具体实现有关的接口的属性。
在面向对象的术语中,记录可以视为用于PIF有关的对象及它们的相关属性的永久存储。这些PIF有关的对象及它们的属性在表1、表2和表3中描述。表1列出了一些接口对象,表2实现对象以及表3摘要描述对象。对本领域的技术人员来说,其他对象能存储在记录中以便补充或取代这些示出的对象同时仍然在本发明的精神和范围内是很显然的。
表1
接口对象 | ||
属性 | 属性值 | 说明 |
InterfaceId | <interface id> | 接口规格的接口id |
MajorVersionnumber | <majorversionnumber> | 接口的主版本号 |
MinorVersionnumber | <minorversionnumber> | 接口的次版本号 |
Selector | <selector> | 字母数字字符串“_”。它在与接口对象有关的<selector>中是唯一的。能为接口对象定义多个<selector>。 |
<selector> | <impl id> | 用于为实现相关接口对象的插件程序起别名。<selector>与接口的版本无关。 |
DefaultImpl | <impl id> | 缺省接口具体实现,接口对象的每个次版本的具体实现id |
表2
具体实现对象 | ||
属性 | 属性值 | 说明 |
ImplId | <impl id> | 接口具体实现的具体实现id |
Image Path | <Container pathname> | 包含相关的接口具体实现的容器或DLL的路径名 |
Entry Func | <_ec_pif_insantiate> | 接口具体实现对象的例示功能的名称 |
Impl MajorVersion | <major versionnumber> | 与接口对象的主版本号不同的具体实现对象的主版本号 |
Impl MinorVersion | <minor versionnumber> | 与接口对象的次版本号不同的具体实现对象的次版本号 |
Params | <string> | 如果定义的话,传递给具体实现对象的例示功能的字符串。能为具体实现对象定义多个参数属性 |
InheritsFrom | <impl id> | 这一具体实现所继承的接口具体实现的<imp id> |
InterceptionType | STACK or Fanout | 这一属性指定通过具体实现对象的相应的InterceptionSequence属性指定的拦截器序列的类型 |
InterceptionSeq | <impl id>,...,<impl id> | 按抒写顺序调用方法的接口具体实现的具体实现ids的有序序列。所指定的接口具体实现均与相同接口有关。 |
表3
配置文件对象 |
属性 | 属性值 | 说明 |
Profile Id | <profile id> | 唯一(记录内)配置文件id |
一组接口对象 | ||
一组具体实现对象 |
插件程序注册
在能使用接口具体实现之前(即,在能实现它之前),必须将其安装到系统中并在记录内登记。要求未注册和/或未安装接口具体实现稍后从记录移出所有相关的信息。为实现这些任务,PIF提供下述命令实用程序:
epifrag()用于登记插件程序
epifunreg()用于取消登记插件程序
epifregedt()用于编辑基于记录的PIF相关的信息。
为示例目的,给出了下面描述的功能epifrag、epifunreg、epifregedt和其他功能的这些功能名。对本领域的技术人员来说,本发明不限于使用在此描述的特定功能是很显然的。
动态可加载库(DLL)
在本发明的一个实施例中,动态可加载库(DLL)用作组件服务器或容器。接口(插件程序)的具体实现能包含在DLLs内。根据一个实施例,DLL可以仅包含一个插件程序,尽管它们的实施例可以支持多个插件程序DLL。插件程序可以不跨越多个DLLs。DLL可以包含可以或可以不用于相同的接口的多个插件程序。DLL可以包含导出的插件程序,其仅实现组成相应的接口的功能子集,以及从另一插件程序继承接口的剩余功能的具体实现。
PIF提供用于加载到调用程序的地址空间和从调用程序的地址空间卸载、以及用于获得加载的DLL中的功能的地址的下述功能或服务:
_e_dl_load用于将可执行模块加载到调用过程的地址空间中。
_e_dl_unload用于从调用过程的地址空间卸载动态可加载库(DLL)模块。这一功能也递减与特定库有关的参考计数。
e_dl getfuncaddr用于获得指定功能名的输出动态可加载库(DLL)的地址。
e_dl_addref用于递增与DLL有关的参考计数。
这些功能能提供为适合于每个所需或支持的个性化的库。例如,为与TUXEDO一起使用,通过TUXEDO标准libgp库提供功能。
插件程序框架外部接口
PIF外部接口包括下述功能:
e_pif_realize()用于实现接口和例示插件程序。
_e_pif dupref()用于递增与插件程序的实例的参考计数(能用于生命期控制),或用于复制插件程序实例。
_e_pif_release()用于递减与用于生命期控制的插件程序实例有关的参考计数。
_e_pif_getinfo()用于获得有关插件程序的信息。
_e_pif_iscompatible()用于版本兼容性校验。
_e_pif_interception_seq()用于获得扇出类型拦截序列中的插件程序实例的接口指针的有序序列。
_e_pif_this()用于获得专用数据的地址。
接口的具体实现
图4示例说明在接口具体实现过程期间的功能调用序列的流程。直到实现其为此,接口仅是具有相关的行为语义学的一组功能特征的规格。在一个实施例中,多个具体实现238能存储在容器240中。在这一例子中,使用DLL文件,不过其他类型的容器能用于这一功能。使用客户应用程序230来登记(以及稍后可选地取消登记)框架记录234内的这些具体实现。注册过程通过如上所述的一系列例程epifreg,epifunreg和epifregedt来实现。在此为例程或功能给出的名称在本发明的所有实施例中是示例性的而不是必需的,相反,可以用等效的机制和例程来取代或代替。
注册过程后,记录由此包含所有当前具体实现的列表。当客户应用程序做出使用具体实现的请求时,它们必须实现接口。这是通过e_pif_realize例程实现的。其他例程,诸如_e_pif_getinfo允许客户应用程序来获得有关接口的另外的信息。将实现接口的调用传递到核心可移植层242。核心可移植层允许PIF本身与操作系统层246无关。PIF将来自客户的具体实现请求转换成核心可移植层的一序列功能请求244以便加载适当的具体实现容器。PIF还将请求248发布到适当的容器以便例示特定的具体实现(以及稍后传递请求250以便释放那个具体实现)。
为使接口有用,接口必须具有语言绑定、具体实现以及用于客户和接口的实现间的交互作用的友好的规则集。这一规则集包括“接口具体实现协议”。接口具体实现协议包含管理客户调用的规则、虚拟功能表、插件程序安装和参考计数。根据本发明的实施例,任何特写接口的客户机在其能调用接口的任一功能前,必须具有支持接口的插件程序的最新创建的例示的句柄(指针)。它通过调用e_pif_realize功能获得用于该接口的句柄,其例子在列表1中示出(使用TM32U来指未特征的整数变量,能使用其他变量类型):
_e_pif_realize(IN_TCADEF,
IN const char*pIId,/*接口id的指针*/
IN const char*pImplId,/*具体实现id的指针*/
IN const struct_e_pifiversion*version,/*接口版本*/
IN const void*data,/*从调用者传递给插件程序的数据*/
IN long datalen,/*所指的缓冲数据的大小*/
OUT void**pI,/*接口指针*/
IN TM32U flags /*标志*/
);
具体实现ID的指针(具体实现ID指针),以下称为plmplld能指定为<impl id>或<selector>或空。如果plmplld指定为空,那么使用在记录数据库(Defaultlmpl属性)中定义的缺省具体实现的<impl id>。根据与记录数据库,诸如例如首先是客户机(调用程序)配置文件,然后是用于接口ids的整个系统的配置文件有关的搜索规则,搜索这一缺省具体实现。
图5表示用来读取客户机存储空间中的具体实现的方法的流程图。如图5所示,在步骤252中,定义一组框架接口。在步骤253中,开发或者指示客户应用程序使用在框架内定义的特定的接口。在步骤254,客户应用程序做出真正使用插件程序框架(PIF)内的接口的请求。执行调用以便实现接口(步骤255)。这导致接收客户接收所需实现的指针(步骤256),然后在步骤257中用来定位具体实现然后将该具体实现拉回局部存储器中。
在这一例子中的接口仅包含单态具体实现(不具有继承)并进一步在图6中描述。在图6中,调用程序(调用程序)260使用PIF262来实现具体实现插件程序A264。该图中的虚线表示在实现接口期间的调用序列以及返回给各个组件的句柄。图6中的实线表示包含在接口具体实现中的数据结构中的关系。调用程序260将请求266发布给PIF262以便实现接口。PIF使用这一请求信息以及存储在记录中的信息以便将例示请求268发送给插件程序A264。PIF使用存储在插件程序Vtble270、专用数据库274以及预先示例的数据结构272内的信息以便创建代理Vtbl274。然后将代理Vtbl的指针278返回给调用程序。调用程序使用这一指针来与接口和实现通信280。下面将进一步详细地描述这些过程的每一个。
如图6所示,所返回的句柄(ip)是存储器内的数据结构,称为代理虚拟功能表(代理Vtbl)。在一个实施例中,虚拟功能表(Vtbl)是指向包括用于正实现的接口的具体实现的实际功能的功能指针的C结构。需要每个插件程序来维护(例如,分配存储块和填充它)其自己的Vtbl。插件程序还负责管理每个实例专用数据以及整个插件程序的_e_pif_plugin_info数据结构。PIF负责向客户显示所实现的接口诸如C结构,其成员是具体实现接口指定的功能特征的功能的指针。
作为接口具体实现过程的一部分,PIF加载包含用于支持接口的目标插件程序的容器或DLL,然后调用插件程序的<_ec_pif_instantiate>()功能,如果其可用且登记的话。否则,它调用整个DLL的_ec_pif_instantiate()功能以便例示插件程序的实例。_ec_pif_instantiate()和<_ec_pif_instantiate>()功能具有相同的功能特性。假定<interface id>的指针以及<impl id>的指针,它们例示插件程序并返回三个句柄:插件程序的Vtbl的地址;插件程序实例专用数据的地址;以及插件程序的_e_pif_plugin_info结构的址。
_e_pif_plugin_info结构包含有关具体实现接口的信息。特别地,EF_PIF_SINGLETON标志向PIF表示具体实现是“单态”。当例示单态具体实现时,例示具体实现的新调用导致参考第一插件程序实例。PIF可以使用这一单态表示来优化对这一具体实现的用于其他_e_pif_realize()调用的参考句柄(因为不需要PIF来调用_ec_pif_instantiate()功能)。如果特定的具体实现切断这一指示,那么每次客户实现该具体实现时,PIF将总是调用_ec_pif_instantiate()功能。非单态插件程序的具体实现总是导致新的插件程序实例。
插件程序生命期
在此使用术语接口生命期控制来指用来确定何时卸载包含目前使用的接口的具体实现的容器或DLL的机制以及规则集。本发明的一个目的是使调用程序或客户不被另一具体实现代替接口当前的具体实现。对客户机来说,组件是其支持的接口。在大多数情况下,客户机不知道有关由组件提供的接口的实际具体实现的任何事情。因此,客户机不能直接控制DLL的生命期,因不同部分的程序可以引用不同的接口和/或由DLL支持的相同接口的多种例示。实际上,客户机不希望卸载DLL,当其通过一个接口完成时,但仍然使用另一接口。确定何时释放DLL由于客户应用程序的复杂性的增加而变更日益复杂。能使用PIF来管理这一生命周期。
为实现此,PIF提供能由PIF客户机调用,用于插件程序生命期控制目的的两个功能,即,_e_pif_dupref()和_e_pif_release()。PIF维护用于每个插件程序实例的参考计数。当客户机获得接口指针时,通过调用接口的_e_pif_dupref()功能,递增相应的参考计数。当使用接口结束客户机时,通过调用接口的_e_pif_release()功能,递减参考计数。当由DLL支持的所有接口的所有参考计数为零时,从存储器卸载DLL。
根据由PIF提供的这两个功能,插件程序可以提供_ec_pif_destroy()功能的具体实现。当用于插件程序的参考计数降低到零时,PIF调用这一功能。有效使用参考计数方案将一些规则强加在部分调用的功能上,如下所述:
1.返回接口指针的功能应当在返回接口指针前,总是调用具有接口指针的_e_pif_dupref()。
2.当通过接口结束客户程序(诸如不再使用接口指针)时,应当调用具有那个接口的e_pif_release()。
3.不管何时将接口指针分配给另一接口指针,功能应当调用_e_pif_dupref()。
4.具有嵌套生命期的接口指针(例如,一个接口指针的生命期在另一个接口指针的生命期内)不需要被参考计数。然而,具有重叠生命期的接口指针必须被参考计数。
5.返回由被调用程序设置的功能参数中的新接口指针的任何功能应当调用具有新接口指针的_e_pif_dupref()。
6.应当拥有功能值的功能参数中的传递到功能中的接口指针不需要_e_pif_dupref()和_e_pif_release(),因为功能已经嵌套在调用程序的生命期内。
7.已知仅存在于功能的生命期的接口指针的局部拷贝不需要_e_pif_dupref()和_e_pif_release()对。
8.如果接口指针存储在全局或成员变量中,客户程序应当在将其传递给另一功能前,调用具有接口指针的_e_pif_dupref()。
9.无论何时成双,应当增加_e_pif_dupref()和_e_pif_release()对。
接口的每种具体实现应当提供支持_e_pif_dupref()功能的_ec_pif_copy()功能。在一个实施例中,当通过EF_PIF_DEEP_COPY标志调用_e_pif_dupref()功能以及插件程序不是单态时,PIF调用插件程序的_ec_pif_copy()功能以便获得插件程序实例的专用数据的拷贝。然后,PIF创建具体实现的新的实例。
每个插件程序容器(DLL)还提供用于例示容器所包含的插件程序的_ec_pif_instantiate()。这一功能由PIF在实现接口期间调用,如果所选择的插件程序不提供其自己的<_ec_pif_instantiate>()功能以及不设置它的<_ec_pif_instantiate>()功能的登记属性值EntryFunc的话。
当调用成员功能时,调用程序必须包括插件程序实例的接口指针(从相应的_e_pif_realize()返回)作为第一参数。根据本发明的实施例,要求所定义的接口的每个插件程序来服从下述规则:
1.应当维护具体实现插件程序实现的接口的功能特征的功能的地址填充的静态Vtbl。这一Vtbl的地址是由相应的_ec_pif_instantiate()功能或插件程序指定的<_ec_pif_instantiate>()功能返回的地址并且将是传递给_e_pif_this()功能作为第二自变量的地址。
2.应当提供用于下述功能的具体实现:
_ec_pif_destroy()破坏插件程序实例。
_ec_pif_copy()创建指定的插件程序实例的副本。
3.应当维护用插件程序指定的信息填充的静态存储块。
4.可选地提供由PIF调用以便例示它的功能。将插件程序的EntryFunc属性设置成其功能名。除名称外,这一功能的功能特征与_ec_pif_instantiate()相同。
5.实现相应的接口功能的插件程序功能应当接收接口指针作为它们的第一参数。
6.插件程序负责管理它们的专用数据,只要适当的话。
7.在插件程序实例的环境中调用的插件程序的所有功能可以访问相同的专用数据区,其是插件程序的预实例并不是插件程序预功能,或插件程序实例的预功能。
8.使用专用数据的插件程序通过调用_e_pif_this()功能,访问它们的专用数据。
具体实现继承
PIF允许一个接口具体实现由相同接口内的另一接口具体实现继承接口方法或功能的子集的具体实现。相同接口的任何两个接口具体实现间的这一继承关系用InheritsFrom属性指定。InheritsFrom属性是正继承的插件程序的属性以及这一属性值识别继承而来的接口具体实现。这一属性采用<impl id>作为其值。
PIF可以支持单态或多个继承。对单态继承,通过设置其InheritsFrom属性为正继承而来的插件程序的<impl id>,继承而来的具体实现可以依次由另一接口具体实现继承而来。
通过具体实现继承的接口实现的存储器布局如图7所述。如图7所示,虚线表示实现接口期间调用序列以及返回给各个组件的句柄;实线表示在接口实现中调用的数据结构中的关系。如前,调用客户程序260向PIF262发布请求266以便实现接口。PIF使用请求和记录中的信息来将例示请求268发送给插件程序A264。来自插件程序A的Vtable、专用数据库274、以及预实例数据结构272的信息被用来填充部分代理Vtable276部分。这允许插件程序A执行接口功能的子集。其余的接口功能由导出的插件程序B284提供。导出的插件程序B提供来自其Vtbl290、专用数据库294以及预实例的数据结构292的信息以便填充代理Vtbl中的其余功能。然后,如前,调用程序使用指针278来经代理Vtable与接口和后备具体实现通信。下述规则适合接口实现过程:
在具体实现继承中或继承序列中调用的所有插件程序应当具有等于正实现的接口的主版本号。
在具体实现继承中调用的至少一个插件程序应当具有等于或高于正实现的接口的次版本号。
导出的插件程序的次版本号(具体实现继承过程的最终输出)是具有具体实现继承过程中调用的所有插件程序中的最高次版本号的插件程序的次版本号。
如果在继承过程期间违反上述规则的任何一个,那么接口实现过程会失败以及EE_PIF_VERSION_MISMATCH错误值返回到_e_pif_realize()的调用程序。
代理Vtbl应当不具有空或无效地址有用输入。
为示例说明本发明的特定实施例的目的,给出了如上所述的特定规则,并论证PIF系统的灵活性。这些规则不需要全部或部分实现以便操作本发明,以及其他规则可以代替如上所述的那些规则,同时仍然在本发明的精神和范围内。
PIF还可以支持接口继承性,其过程与用于插件程序继承所示的操作相同。
拦截器
拦截器提供将服务增加到系统上的灵活的装置。它们允许客户机和将扩展和专业化的目标对象间的绑定以便反映两者间的相互需求。拦截器能是调用中提出的逻辑推理以及提出请求的客户应用和对其提出的对象的具体实现间的响应码路径。同样地,拦截器是提供正提出的服务的结构化接口具体实现或插件程序的功能或方法。
在本发明的一个实施例中,引擎支持两种拦截器:扇出型拦截器和堆栈型拦截器。通过一对属性指定拦截器, 即InterceptionType和InterceptionSeq。这些属性与接口具体实现<impl id>有关。InterceptionType属性指定拦截的类型(Fanout或Stack),而InterceptionSeq属性定义拦截序列。
InterceptionSeq属性指定拦截插件程序以及它们的拦截顺序。在一个实施例中,其值是逗号分开的有序的一组<impl id>,描述以当相应的接口的功能被调用时指定的顺序调用的方法的插件程序的顺序。在将接口的动词称为代码路径的情况下,在InterceptionSeq值的数据字段中指定的接口具体实现的相应功能按指定的顺序调用。
扇出型拦截器
在图8中示例说明扇出型拦截。如图8所示,扇出型拦截能完全与PIF无关地实现。PIF不需要知道其存在以及就所涉及的PIF而言,拦截序列仅仅是由用InterceptionSeq属性指定的拦截序列组成的一组插件程序。在这一方法中,然而,扇出型插件程序需要知道如何访问记录以便获得相应的InterceptionSeq属性值。这能通过暴露记录应用编程接口(API)或通过使用PIF帮助来由扇出型拦截器支持访问来实现。
在一个实施例中,PIF可以通过_ec_pif_instantiate()以及_e_pif_interception_seq()功能提供所需支持。再参考图8,在这一拦截模型中,调用客户程序或调用程序302调用插件程序A304的方法,但不知道拦截插件程序306、308、310和312。在插件程序A的例示期间,由插件程序A的InterceptionSeq属性指定的拦截插件程序也由PIF例示以及将拦截插件程序的这些实例的有序地址的序列经_ec_pif_instantiate()传递给插件程序A。由客户程序或接口调用程序调用的后来的方法导致按由InterceptionSeq属性指定的顺序调用拦截插件程序的相应的方法。
这一拦截模型的关键特征能被指定如下:
假定客户程序调用插件程序A的方法X(在图8中表示为303),插件程序A的方法X按由插件程序A的InterceptionSeq属性指定的扇出顺序调用拦截插件程序的的方法Xs如下:
调用插件程序1的方法X314
插件程序1的方法X返回316
调用插件程序2的方法318
插件程序2的方法X返回320
调用插件程序3的方法322
插件程序3的方法X返回324
…
调用插件程序n的方法326
插件程序n的方法X返回328
以及最后,插件程序的方法X返回到调用程序329。
拦截插件程序的方法返回有关功能返回成功或失败。
通过返回失败条件的第一方法停止有序方法调用,以及状态返回到客户程序。
在拦截中调用的所有插件程序实现相同的接口,即,它们相应的方法具有相同的特征。
在拦截序列中不允许多个并行的相同插件程序。
不允许扇出型拦截序列中的拦截插件程序是扇出型插件程序或堆栈型插件程序。
不允许插件程序同时是扇出型插件程序和堆栈型插件程序。
不允许扇出型插件程序为导出(即,继承)插件程序。
为示例说明本发明的特定实施例,以及论证PIF系统的灵活性的目的给出了如上所述的特定规则。这些规则不需要全部或部分实现以便操作本发明的,以及其他规则可以取代如上所述的那些规则,同时仍然在本发明的精神和范围内。
堆栈型拦截器
图9示例说明堆栈型拦截。在图9所示的堆栈型拦截模型中,客户程序332调用插件程序A334的方法,但不知道拦截插件程序336、338、340。PIF在接口实现期间负责加载和例示由相关的InterceptionSeq属性指定的、除插件程序A以外的拦截插件程序,以及连编和维护拦截序列。
由客户程序(接口调用程序)的插件程序A的方法的后来的调用导致按InterceptionSeq属性指定的顺序调用拦截插件程序的相应的方法的调用。在实现调用堆栈型拦截序列的接口的实现期间,PIF将接口指针经序列中的每个插件程序的<_ec_pif_instantiate>()功能传递给拦截序列中的下一插件程序。
这一拦截模型的关键特征能指定如下:
假定客户程序调用插件程序A的方法X(如图9中333所示),按由插件程序A的InterceptionSeq属性指定的顺序调用拦截插件程序的方法Xs如下:
插件程序A的方法X调用插件程序1 342的方法X
插件程序1的方法X调用插件程序2 344的方法X
…
插件程序n-1的方法X调用插件程序n 346的方法X
插件程序n的方法X返回348
插件程序n-1的方法X返回
…
插件程序2的方法X返回350
插件程序1的方法X返回352
插件程序A的方法X返回到调用程序355。
当通过扇出型拦截器、通过堆栈拦截器,包含在拦截中的所有插件程序实现相同的接口,即,它们的相应的方法具有相同的特征。
通过返回失败条件的第一方法停止有序方法调用,以及这一状态返回给客户程序。
除该序列中的最后一个拦截插件程序允许为非拦截(既不是扇出型也不是堆栈型)插件程序外,要求在堆栈型拦截序列中包含的所有插件程序为堆栈型插件程序。
在拦截序列中不允许多个并行的相同插件程序。
不允许插件程序既是扇出型而且是堆栈型(堆栈已知)的插件程序。
不允许堆栈型插件程序是导出(即继承)插件程序。
为示例说明本发明的特定实施例以及论证PIF系统的灵活性的目的,给出了上述特定的规则。这些规则不需要全部或部分实现以便操作本发明,以及其他规则可以替代如上所述的那些规则,同时仍然在本发明的精神和范围内。
过程线程(threading)
在本发明的一个实施例中,PIF能使对特定的具体实现的_ec_pif_instantiate()、_ec_pif_copy()和_ec_pif_destroy()功能的调用连续,并利用单独的处理线程。这能大大地有助于系统的整体性能。
接口功能实用程序
下述部分示例说明与PIF系统一起使用以便登记具体实现和实现接口的各种功能。对本领域的技术人员来说,在本发明的精神和范围内,能使用另外的或备选的功能是很显然的。
_e_dl_load
_e_dl_load功能将特定的可执行模块映射到调用过程的地址空间中。
_e_dl_load(IN_TCADEF,IN const char*dllpath,/*可执行模块的文件名的地址*/
OUT ET_DL_HANDLE *dllhandle,/*DLL句柄*/
IN TM32U flags/*标志*/
);
其中_TCADEF是引擎环境的可选ANSI定义(典型地仅用于Tuscedo具体实现)。
dllpath是命名DLL文件的空结尾串的指针。如果该串指定路径,但该文件在指定的目录中不存在,该功能失败。如果该串不指定整个路径名,该功能使用标准的搜索策略来寻找该文件。
dllhandle是用在以后的_e_dl_unload和_e_dl_getfuncaddr功能中的DLL句柄。
_e_dl_unload
该_e_dl_unload功能卸载DLL:
_e_dl_unload(IN_TCADEF,IN ET_DL_HANDLE dllhandle,/*加载库模块的句柄*/
IN TM32U flags/*标志*/
)
该_e_dl_unload功能由调用过程的地址空间卸载指定的库。在这一调用后,指定句柄不再有效,其中:
dllhandle识别加载库模块,_e_dl_unload功能返回这一句柄。
_e_dl_getfuncaddr
该_e_dl_getfuncaddr功能返回特定的输出动态链接库(DLL)功能的地址:
_e_dl_get funcaddr(IN_TCADEF,IN ET DZ HANDLE dllhandle,/*加载库模块的句柄*/
IN const char*pFuncName,/*功能名*/
OUT void**pfa,/*功能地址的指针*/
IN TM32Uflags/*标志*/
);
该_e_dl_getfuncaddr功能返回在pfa中的特定输出动态可加载库(DLL)的地址,其中:
_TCADEF是如前的引擎环境的ANSI定义。
dllhandle识别包含该功能的DLL模块。该_e_dl_load功能返回这一句柄。
pFuncName指向包含该功能名的空结尾串
pfa是功能地址的指针。
_e_dl_addref
该_e_dl_addref功能递增与加载的DLL有关的参考计数:
_e_dl_addref(IN TCADEF,
IN ET_DL_HANDLE dllhandle,/*DLL句柄*/
IN TM32U flags/*标志*/
);
_e_dl_addref递增由dllhandle指定的DLL的参考计数。对插件程序的时刻的指针的每个新拷贝,应当调用它。
dllhandle识别包含该功能的DLL模块。_e_dl_load功能返回这一句柄。
_ec_pif_instantiate
该_ec_pif_instantiate功能例示插件程序:
_ec_pif_instantiate(IN_TCADEF,
IN const chare*pIId,/*接口id的指针*/
IN cons tchare*pImplId/*具体实现id的指针*/
IN const struct_e_pif_ivrsion*version/*接口版本*/
IN const struct_e_pif_data*pData/*从调用者和/或记录传递的数据*/
IN const struct_e_pif_interception_data*pInterceptionData/*拦截数据*/
INOUT const struct_e_pif_instance_handles*pI/*实例cookies*/
IN TM32U flags/*标志*/
);
该_ec_pif_instantiate()功能是由插件程序框架(PIF)在实现接口(即作为客户调用_e_pif_realize()的结果)期间调用的整个容器的、缺省插件程序实例例示功能(<_ec_pif_instantiate>())。其由插件程序实施者实现并仅在插件程序指定的例示功能不可用时才调用它。如果提供插件程序指定的<_ec_pif_instantiate>()功能,那么调用这一功能而不是整个DLL的_ec_pif_instantiate()功能。插件程序指定的<_ec_pif_instantiate>()功能具有与_ec_pif_instantiate()功能相同的功能特征,其中:
plld是接口标识符的指针。
pimpled是具体实现标识符的指针。
version是接口的版本。
pData是从调用程序和/或记录传递的数据
pinterceptionData是拦截数据的指针
pl是插件程序实例句柄的指针。
假定<interface id>的指针、接口版本和<impl id>指针,_ec_pif_instantiate()功能例示实现正实现的接口的插件程序并返回有关插件程序句柄和由pl指向的存储器块中正例示的插件程序的实例的一组句柄。vresion指定由plld指向的<interface id>的接口的版本。
pInterceptionData指向数据类型结构e_pif_interception_data的核心内数据结构,定义如下:
structe_pif_interception_data{
struct_e_pif_iversion m_pif_version;/*这一结构的版本*/
viod const**fanout_interception_seq;/*在扇出型拦截序列中实例地址的有序序列*/
TM32U fanout_interception_seq_len;/*拦截序列中地址的数量*/
void*next_ip;/*在堆栈型拦截序列中(相对于被调用者)的插件程序实例的地址*/
}
指针pl指向数据类型结构e_pif_instance_handles的存储器块,定义如下:
struct_e_pif_interception_handles{
struct_e_pif_iversion m_pif_version;/*这一结构的版本*/
viod*pvtbl;/*插件程序Vtbl的地址*/
viod*pPrivData;/*专用数据的地址*/
struct epif_plugin_info*pPluginInfo;/*插件程序信息*/
};
在pInterceptionData结构中,pVtbl包含正例示的插件程序的Vtbl的地址。pPrivData包含正创建的插件程序的实例的专用数据的地址。pPluginInfo包含类型结构_e_pif_plugin_info的存储块的地址,包含指定给正例示的插件程序的插件程序信息。插件程序的责任是填充这一结构的字段。_e_pif_plugin_info表示如下:
typedef struct_e_pif_plugin_info{
struct_e_pif_iversionm_pif_version;/*插件程序框架的版本*/
struct_e_pif_iversion m_i_version;/*由插件程序实现的接口的版本*/
char*mimplid;/*接口具体实现id*/
char*minterfaceid;/* 接口id*/
intmVtblsize;/* 根据输入的数量的Vtbl的大小*/
char*m_vendor;/*卖主名*/
char*mproductname;/*产品名*/
char*mvendorversion;/*卖主分配的产品号*/
TM32U m-flags;/*标志*/
/*PIF利用的功能的地址*/TM32I(*destroy)(_TCADEF,constStruct
_e_pif_instanee_handles*,TM32U);/* 由PIF调用以便破坏插件程序的功能*/
TM32I(*copy)(TCADEF,conststruct_e_pif_interception_data*,
struct_e_pif_instance_handles*,TM32U);/*由插件程序调用以便拷贝插件程序的专用数据的功能*/
}_e_pif_plugin_info,*p_e_pif_plugin_info
_e_pif_plugin_info结构包含与接口的具体实现有关的信息。m-flags字段定义由具体实现设置并由PIF解释的标志。在本发明的一个实施例中,定义下述标志:
EF_PIF_SINGLETON--具体实现是单态对象的信号或标志
EF_PIF_STACK--具体实现是堆栈型拦截插件程序的信号
EF_PIF_FANOUT--具体实现是扇出型拦截插件程序的信号
EF_PIF_CONCURRENCYAWARE--具体实现(不管是导出实现还是扇出或堆栈型拦截顺序的首部)是并发意识的信号。
EF_PIF_SINGLETON标志是向插件程序框架表示具体实现是否是单态的暗示。当例示单态具体实现时,例示具体实现的新调用导致第一插件程序实例的参考。PIF能使用这一暗示来优化用于其他这一具体实现的_e_pif_reaiize()调用的参考句柄(因为不要求插件程序框架调用_ec_pif_instantiate()功能)。
由m_flags字段指定的标志并不互斥。EF_PIF_QUERY是这种标志的一个例子。当设置它时,_ec_pif_instantiate()填充pVtbl和由pl指向的struct_e_pif_instance_handles的pPluginlnfo字段而不例示该插件程序。
_e_pif_realize
该_e_pif_realize功能实现接口:
_e_pif_realize(IN_TCADEF,
IN const char*pIId,/*接口id的指针*/
IN cons tchar*pImplId,/*具体实现id的指针*/
IN const struct_e_pifiversion*version,/*接口版本*/
IN const void*data,/*从调用者传递给插件程序的数据*/
IN long datalen,/*所指的缓冲数据的大小*/
OUT void**pI,/*接口指针*/
IN TM32U flags /*标志*/
);_e_pif_realize功能通过例示由plmplld指定的接口实现,实现由plld和version指定的接口。接口的客户程序在其调用任何接口的功能前,应当具有支持接口的插件程序的新创建的例示的指针。它通过调用_e_pif_realize功能获得用于接口的这一句柄。
plmplld是用于将例示的插件程序的<impl id>或<selector>。
如果将plmplld指定为NULL,那么将加载用于接口<interface id>的缺省具体实现(Defaultlmpl)以便支持该接口。如果没有设置用于接口的缺省具体实现,那么加载具有等于(正实现)的接口的主版本号以及最高次版本号的登记的具体实现以便支持属于以下指定的版本控制规则的接口:
目标插件程序的主版本号应当与接口的主版本号匹配。否则,正实现的接口以及目标具体实现将不兼容。
目标插件程序的次版本号应当等于或高于正实现的接口的次版本号。否则,接口和目标具体实现将不兼容。
如果目标具体实现正从其他插件程序继承而来,在继承序列中的所有插件程序应当具有等于正实现的接口的主版本号。
如果目标具体实现正从其他插件程序继承而来,在继承序列中的至少一个插件程序应当具有等于或高于正实现的接口的次版本号。
如果指定plmplld并且设置EF_PIF_EXACT_MATCH标记,那么受如上所述的版本控制规则的控制,加载由plmplld指定的插件程序。如果未登记(即,未找到),那么这一功能失败并返回EE_PIF_NOT_REGISTERED错误值。
如果指定plmplld,但未登记或找到,以及不设置EF_PIF_EXACT_MATCH标志,那么系统尝试用于接口的缺省具体实现。如果缺省具体实现不兼容或未找到,那么系统将尝试定位具有等于或大于在版本自变量中指定的值的最高次版本的兼容具体实现。如果兼容具体实现不存在,那么功能失败,返回EE_PIF_NOT_REGISTERED错误。然后根据与记录诸如例如,第一客户程序(调用程序)配置文件和用于接口ids的整个系统的配置文件有关的搜索规则,定位所指定的插件程序
data指向从调用程序传递给插件程序的数据,以及datalen指定由data指向的缓冲器的长度。
_e_pif_dupref
_e_pif_dupref(IN_TCADEF,
IN void *pI,/*插件程序实例的指针*/
OUT void**ppdup,/*复制的插件程序实例*/
IN TM32U flags /*阴或深拷贝*/
);
_e_pif_dupref功能递增与加载的插件程序实例有关的参考计数或复制插件程序实例:
_e_pif_dupref使由pl所指的插件程序实例的参考计数递增并将插件程序实例的地址复制到ppdup。应当调用用于每个插件程序的时刻的指针的新拷贝。
标志可以包括EF_PIF_DEEP_COPY,如果指定的话,其使插件程序框架创建由pl指定的实例的副本并将副本的接口指针返回到ppdup。复制实例具有用于其专用数据(如果存在的话)、生命控制和唯一接口指针的其自己的存储块。
_e_pif_release
该_e_pif_release功能使与加载的插件程序实例有关的参考计数递减:
_e_pif_release(IN_TCADEF,
IN void*pI,/*将释放的插件程序实例的指针*/
IN TM32U flags /*标志*/
);
_e_pif_release使由接口指针pl所指的插件程序实例的参考计数递减。如果指定插件程序实例的参考计数下降到0,那么破坏插件程序实例。
e_pif_iscompatible
如果由插件程序实例支持特定的接口版本,检查e_pif_iscompatible:
_e_pif_iscompatible(IN_TCADEF,
IN void *pI,/*插件程序实例的指针*/
IN const struct_e_pif_iversion*version,/*接口版本*/
IN TM32U flags/*标志*/
);
检查e_pif_iscompatible以便查看由pl所指定的插件程序实例是否与由version指定的接口版本兼容。
_e_pif_interception_seq
该_e_pif_interception_seq功能返回拦截序列中插件程序的实例的地址的有序顺序:
_e_pif_interception-seq(IN_TCADEF,
IN void*pI,
OUT const struct_e_pif_interception_data**ppinterceptionData,/*拦截数据*/
IN TM32U flags /*标志*/
);
在序列中可以仅有一个插件程序,不论如何,_e_pif_interception_seq将调用序列中,相对于由pl指定的插件程序实例的拦截插件程序的实例的地址返回到由*ppinterceptionData所指的数据类型struct_e_pif_interception_data的核心数据结构中。
数据结构struct_e_pif_interception_data定义如下:
struct e_pif_interception_data{
struct_e_pif_iversion m_pif_version;/*这一结构的版本*/
void**fanout_interception_seq;/*扇出型拦截序列中实例地址的有序序列*/
TM32U fanout_interception_seq_len;拦截序列中地址的数量*/
void**next_ip;/*在堆栈型拦截序列中(相对于被调用者)的插件程序实例的地址*/
};
如果调用程序是扇出型插件程序,那么将组成用于Fanout插件程序的拦截序列的Fanout拦截插件程序实例的地址的n个有序序列返回到数组*fanout_interception_seq。fanout_interception-seq_len变量指定这一数组中的地址数。
在堆栈型拦截插件程序的情况下,将调用序列中的下一插件程序实例的地址返回到*next_ip。如果由pl指定的插件程序实例是拦截序列中的最后一个插件程序实例,那么在*next_ip返回Null。
_e_pif_this
使用该_e_pif_this功能来返回专用数据区的地址:
_e_pif_this(IN_TCADEF,
IN void*pI,
IN const void*pVtbl,
OUT void**ppriv,
IN TM32U flags /*标志*/
);
_e_pif_this由pl指定的插件程序实例的专用数据区的地址。pVtbl句柄指向插件程序特定的Vtbl。在创建插件程序实例期间,这是其地址由<_ec_pif_instantiate>()功能返回的相同的Vtbl。
_e_pif_getinfo
使用该_e_pif_getinfo功能来获得有关加载插件程序的信息:
_e_pif_getinfo(IN_TCADEF,IN void*pI,
OUT TM32U*info_seq_len,
OUT const_e_pif_plugin_info_public*const**pInfo,
IN TM32U flags /*标志*/
);
该_e_pif_getinfo获得有关由pl指定的插件程序实例的信息。这一信息被返回到由pinfo所指的_e_pif_plugin_info-public结构中:
typedef struct_e_pif_plugininfo_public{
struct_e_pif_iversion m_pif_version;/*PIF_的版本*/
struct_e_pif_iversion m_I_version;/*由插件程序实现的接口的版本*/
char*m_impl_id;/*接口具体实现id*/
char*m_interface_id;/*接口id*/
char*m_vendor;/*卖主名*/
char*m_productname;/*产品名*/
char*m_vendorversion/*卖主指定的版本号*/
TM32U m_flags;
}_e_pif_plugin_info_public,*p_e_pif_plugin_info_public;
m_flags定义由具体实现设置和由PIF解释的标记,并包括EF_PIF_SINGLETON、EF_PIF_STACK、EF_PIF_FANOU以及EF_PIF_CONCURRENCYAWARE,下面将进一步描述它们。并发意识总是暗指混合行为,如果插件程序是导出的插件程序或拦截序列的首部,那么这表示包含在组成中的插件程序是同时知道的并且如果一个组件不支持并行性,那么该组成不是并行知道的。因此,在这种情况下,不返回并行知道标记。
flags自变量指定可选标记,例如,EF_PIF_DETAILEDINFO标记。如果指定的话,_e_pif_getinfo()返回有关所指定的插件程序的详细信息。如果所指定的插件程序是导出具体实现,那么返回有关从最早导出的具体实现的、包含在导出的插件程序中的所有具体实现的的信息。如果指定的插件程序是Fanout型或STACK型拦截序列的首部,那么返回从在拦截插件程序之后指定的插件程序(拦截序列的首部)开始的、包含在拦截序列中的有关所有插件信息,在Fanout型的情况下,从左至右,以及在STACK型的情况下,从上到下。
_ec_pif_destroy
使用_ec_pif_destroy功能来破坏插件程序实例:
_ec_pif_destroy(IN_TCADEF,
INOUT struct_e_pf_instance_handles*pIhandles,/* 实例cookies*/
IN TM32U flags /*标志*/
);
_ec_pif_destroy释放由plhandles指定的插件程序实例指定的系统资源。plhandles指向定义如下的数据类型struct_e_pif_instancehandles的存储块:
struct e_pif_instance handles{
struct e_pif_iversion m_pif_version;/*这一结构的版本*/
void*pVtbl;/*插件程序Vtbl的地址*/
void*pPrivData;/*插件程序实例指定的专用数据的地址*/
struct_e_pif_plugin_info*pPluginInfo;/*插件程序信息*/
}
其中PVtbl包含插件程序实例的Vtbl的地址,以及pPrivData包含正破坏的插件程序实例的专用数据的地址。如果插件程序实例未使用专用数据,那么pPrivData的值设置成NULL。pPluginInfo包含类型struct_e_pif_plugin_info的存储块的地址,包含对插件程序实例特定的插件程序信息。当与插件程序实例有关的参考计数下降到零时,这一功能仅由PIF调用。
_ec_pif_copy
该_ec_pif_copy功能创建插件程序实例的副本:
_ec_pif_copy(IN_TCADEF,
IN conststruct_e_pif_interception_data*pInterceptionData,/*拦截数据*/
INOUT struct_e_pif_instance_handles*pIhandles,/*实例cookies*/
IN TM32U flags /*标志*/
);
该_ec_pif_copy创建由plhandles指定的插件程序实例的副本并返回指针以便复制由plhandles所指的数据结构中的拷贝。
pInterceptionData指向数据类型struct_e_pif_interceptiondata的核心数据结构(如上定义),而handles指向数据类型结构e_pif_instance_handles(也如上定义)的存储块。
pVtbl是包含正复制其专用数据的插件程序实例的Vtbl的地址。pPrivData是包含插件程序实例专用数据的地址的指针。如果插件程序实例未使用专用数据,则返回NULL。pPluginlnfo指针包含类型struct_epif_plugin_info的存储块的地址,包含如下所示的插件程序实例指定信息。
typedef struct_e_pif_plugin_info{
struct_e_pif_iversion m_pif_version;/*插件程序框架的版本*/
struct_e_pif_iversion m_i_version;/*由插件程序实现的接口的版本*/
char*m_impl_id;/*接口具体实现id*/
char*m_interface_id;/*接口id*/
int m_Vtbl_size;/*根据输入数量的Vtbl的大小*/
char*m_vendor;/*卖主名*/
char*m_productname;/*产品名*/
har*m_vendorversion;/*卖主指定的版本号*/
TM32Um_flags;/*标志*/
/*PIF利用的功能的地址*/
TM32I(*destroy)(_TCADEF,const struct_e_pif_instance_handles*,
TM32U);/*由PIF调用的功能以便破坏插件程序*/
TM32I(*copy)(_TCADEF,conststruct_e_pif_interception_data*,struct_e_pf_instance_handles*,TM32U);/*由PIF调用的功能以便拷贝插件程序专用数据*/
}_e_pif_plugin_info,*p_e_pif_plugin_info;
_e_pif_plugin_info结构包含与接口的具体实现有关的信息。m_flags字段定义由具体实现设置和由PIF解释的标志。标记可以包括EF_PIF_SINGLETON、EF_PIF_STACK、EF_PIF_FANOUT和EF_PIF_CONCURRENCYAWARE/*,下面将进一步描述它们。
epifreg
epifreg功能或命令登记插件程序具体实现并使用下述语法:
epifreg-p implid-i interfaceid-v Major.Minor-f imagepath\
[-e entryFunction][-b baseImplid][-o profileId]
[-u userParameters]\
[-s InterceptorType[:implidl,…,implidN]]
epifreg功能能采用如上所示的各种选项,其中选项具有下述意思:
-p所登记的插件程序的具体实现标识符。具体实现标识符是具有下述语法的唯一值<implid>::=<component name>[/<sub-component name>]/<implementation name>
-i由插件程序实现的接口的标识符。接口标识符是具有下述语法的唯一值:<interfaceid>::=<component name>[/<sub-component name>]/<interface name>。如果接口不存在于记录中,那么自动创建它。
-v由插件程序实现的接口的版本号。版本号由主版本号和次版本号组成。
-f包含插件程序具体实现的容器或动态可加载库(DLL)的路径名
-e实现_ec_pif_instantiate()例程的功能名。这一功能由插件程序框架使用来例示插件程序。如果未指定这一选择,插件程序框架将使用缺省ec_pif_instantiate()例程。
-b使用这一选项来指定这一插件程序使用具体实现继承性。
-o使用这一选项来将插件程序增加到指定的配置文件中。如果配置文件不存在,创建新配置文件。配置文件能通过将EV_PIF_PROFILE环境变量设置成配置文件标识符来与过程相关。插件程序框架总是在其搜索缺省整个系统的配置文件“SYSTEM”前,搜索指定配置文件中的插件程序信息。
-u在其例示期间,将传递到插件程序具体实现的用户参数(例如,字符串)。
-s使用这一选择来指定插件程序是拦截器。拦截器型自变星是指由插件程序实现的拦截的类型以及其值能是STACK或Fanout。可选地,拦截序列也可以在“:”字符后指定。这一拦截序列是指定拦截插件程序和拦截顺序的具体实现标识符的逗号分开的列表。
epifunreg
该epifunreg功能未登记插件程序:
epifunreg-p implid[-o profileId]
epifunreg命令未登记特定的插件程序。-p选项指定未登记的插件程序的具体实现标识符。如果仅使用这一选项,那么,存储在插件程序框架中的插件程序数据未被登记(包括存储在所有现有的配置文件中的数据)。能可选地使用-o选项来指定有关插件程序的信息应当从指定的配置文件移出。这一命令不能移出有关相关的插件程序接口的数据,其能通过epifregedt命令移出。
epifregedt
该epifregedt编辑具体实现、接口和存储在插件程序框架记录中的配置文件的属性:
epifregedt[-g-s-d-c-m]-k Key[-a AttrName[=AttrValue]
epifregedt命令编辑用-k选项指定的PIF记录对象的属性。记录对象在具有它们的相应的Key的记录内被唯一地识别。PIF记录对象的Key具有下述语法:
<ProfileId>[/implinterfaces/<Objld>]
其中:
<ProfileId>是在其中记录对象的配置文件的配置文件id。
impl指定对象是具体实现对象。
interfaces指定对象是具体实现对象。
<Objld>指定接口对象id(Interfaceld)或具体实现对象id(Implld)。
插件程序框架在用于指定接口和/或具体实现对象数据的记录中搜索指定的配置文件。<Profileid>或<Objld>能被指定为“*”以便表示编辑操作分别应用到所有现有的配置文件或接口/具体实现ids。“SYSTEM”是用于缺省的整个系统的配置文件的<Profile id>。
使用-a选项来指定包含在指定对象上的编辑操作中的属性。AttrName是编辑对象的属性的名称以及AttrValue值是指定给该属性的值。一些属性能用来使特定编辑操作的范围变窄(诸如设置、创建或删除)。
下述选项指定由epifregedt命令执行的编辑操作:
-g获得指定对象的选定属性的值。如果未用-a选项指定属性,那么检索对象的所有属性。否则,仅检索指定的属性。通过这一选项以及所有其他选择,如果提供AttrValue,指定它,那么使用它使这一操作的范围变窄。在指定具有相应的AttrValue值的AttrName属性的情况下,那么仅检索具有用于相应的AttrName属性的相同的AttrValue值的对象。
-s设置、创建或改变指定对象的选定属性的值。当在记录中创建新对象时,需要一些属性。这些属性用-a选项指定。
-d删除这一指定对象的选定属性。如果没有用-a选项指定属性,那么从记录移出对象以及所有它的属性。否则,仅删除指定的属性。
-c将指定的对象拷贝到另一配置文件。新配置文件应当将Profield作为用于AttrName的值以及将新配置文件标识符用作AttrValue值来用-a选项指定。
-m将指定的对象移动到另一配置文件上。该新配置文件应当将Profield用作用于AttrName的值以及将新配置文件标识符用作AttrValue值用-a选项指定。如果目标配置文件不存在,那么创建新配置文件。
例子具体实现
这一部分提供论证如何构造PIF适应的客户应用程序以及相应的插件程序的抽样码示例。仅为论证目的示出了下述文件以便更好地示例说明本发明。对本领域的技术人员来说,可以扩展所使用的过程以便应用于更复杂的情形和应用,以及本发明不限于以下给出的C语言例子是很显然的。
使用插件程序向导或类似的工具,能用元语言格式定义插件程序。元语言定义插件程序操作,以及诸如插件程序名、接口名以及接口版本号的这些变量。
插件程序描述文件
下述插件程序描述文件(dummy.pi)是用来定义插件程序的描述文件的例子。在一些实施例中,插件程序描述可以由插件程序向导或插件程序设计工具创建。最少它应当包含插件程序名(在这种情况下为“dummy”)、接口名(“sec”)以及接口版本号(“1.2”)。插件程序还应当包含多个操作(在这一例子中,表示为op1、op2、op3和op4)。这些操作定义插件程序将真正提供给调用应用程序的功能。
=========dummy.pi=========
@plugin dummy
@interface sec
@interface_version 1_2
@operations
void op1(inti,double k)
int op2(void*foo)
void*op3(const char*)
char*op4()
@end
插件程序头文件
下面的dummy.h文件是所生成的包含由插件程序向导输出的头文件的例子。必须在编译时将头文件包括到每个插件程度具体实现以及客户应用中。所包括的文件提供插件程序操作的特定接口的说明。
==========dummy.h===========
#ifndef dummy_h
#define dummy_h
#include“e_eng_pif.h”
struct sec_1_2;;
typedef struct sec_1_2_Vtbl{
void(*op1)(struct sec_1-2*,int i,double k);
int(*op2)(struct sec_1_2*,void*);
void*(*op3)(struct sec_1_2 const char*x);
char*(*op1)(struct sec_1_2);
}sec_1_2,*sec_1_2_ptr;;
#define sec_1_2_op1(ip,_a1,_a2)\
(ip->op1(ip,(_a1),(_a2)))
#define sec_1_2_op2(ip,_a1)\
(ip->op2(ip,(_a1)))
#define sec_1_2_op3(ip,_a1)\
(ip->op3(ip,(_a1)))
#define sec_1_2_op4(ip)\
(ip->op4(ip))
#endif/*dummy_h*/
在这一例子中,所包括的文件包括名称(“dummy”)以及定义用于特定接口和版本号(在这种情况下sec.1.2)的数据结构定义。该数据结构包括用于由这一特定接口和版本号支持的所有操作的指针。
插件程序应用文件
下面的dummy.c文件是所生成的构架模板的例子,并表示实际的插件程序应用。来自所生成的.h文件的唯一修改是用在每个操作具体实现中生成的注释代替实际代码,以及将专用数据成员增加到专用数据结构上。c文件当被编译时,被用来提供实际插件程序具体实现。需要某些动词(诸如pif-destroy和pif-copy)以便接口与调用应用程序成功握手。其他动词(op1,op2,op3和op4)提供插件程序框架的功能操作。
==========dummy.c=========
#include“dummy.h”
#include<malloc.h>
#include(string.h>
#include“e_eng_pif.h”
typedef struct{
……
}Privatesec_1_2,*Privatesec_1_2_ptr;;
int
sec_1_2_ec_pif_destroy_impl(const struct_e_pif_instance_handles
*PI)
{
……
if(pI->pPrivdata!=Null)
free(PI->pPrivdata);
}
int
sec_1_2_ec_pif_destroy_impl(const struct_e_pif_interception_data
*pInterceptionData,struct_e_pif_instance_handles*pI){
……
}
static void
sec_1_2_op1_imp(struct sec_1_2*ip,int i,double k)
{
……
}
static int
sec_1_2_op2_impl(struct sec_1_2*ip,void*foo)
{
……
}
static void
sec_1_2_op3_impl(struct sec_1_2*ip,const char*x)
{
……
}
static char*
sec_1_2_op4_impl(struct sec_1_2*ip)
{
……
}
static const _e_pif_plugin_info sec_1_2_plugin_info={
/*m_pif_version.i_major_verison*/1,
/*m_pif_version.i_minor_verison*/0,
/*m_i_version.i_major_verison*/1,
/*m_i_version.i_minor_verison*/2,
/*m_impl_id*/”sec1”,
/*m_interface_id*/”sec”,
/*m_Vtbl_size*/4,
/*m_flags*/0,
/*plugin Vendor Info*/
/*m_vendor*/“RSA”
/*m_productnam*/“Roadrunner exterminator”
/*m_verdorversin”*/”2000”
/*PIF imposed function*/
sec_1_2_ec_pif_destroy_impl,
sec_1_2_ec_pif_copy_impl,
}
staticsec_1_2_Vtbl Vtblsec-1_2={
sec-1_2_op1_impl,
sec-1_2_op2_impl,
sec-1_2_op3_impl,
sec-1_2_op4_impl,
};
#ifdef_cplusplus
extern“c”
#endif
#ifdef Win32
_declspec(dllexport)
#endif
int
sec_1_2_instantiate
IN const char pIId,/*接口id的指针*/
IN const char pImplid,/具体实现id的指针*/
IN struct_e_pif_iversion version,/*接口版本*/
IN const struct_e_pif_data*pData/*从调用者和/或记录传递的数据*/
IN const struct_e_pif_interception_data
*pInterceptionData,
/*拦截数据*/
INOUT struct_e_pif_instance_handle pI,/插件程序实例的指针*/
IN TM32U flags /*标志/
)
{
privatesec_1_2_ptr priv;;
……
if(flags&EF_PIF_QUERY){
pI->pPluginInfo=&sec_1_2_plugin_info;
}
else{
priv=(Privatesec_1_2_ptr)calloc(1,sizeof*priv);;
if(!priv){
return EE_PIF_NORESOURCE;
}
pI->pVtbl=&Vtblsec_1_2;;
pI->pPrivData=priv;;
pI->pPluginInfo=&sec_1_2_plugin_info;
}
……
return;
}
下面所示的test.c文件是加载和调用插件程序上的操作的客户应用的例子。编写客户应用程序以便调用所需接口定义(在dummy.h中指定)。客户应用程序必须成功地实现具有指定插件程序的所需接口(sec)。此后其使用指针(引脚)来指向具体实现Vtable(Vtbl)。通过一系列输出命令调用操作本身。
=========test.c===========
#include<stdio.h>
#include“e_eng_pif.h”
#include“dummy.h”
main()
{
struct sec_1_2*pin;
struct_e_pif_inversion version;
version.i_major_verion=1;
version.i_minor_verion=2;
if
(_e_pif_realize(“sec”,”secl”,&version,Null,NUll,&pin,Null,0)!=EE_PIF_SUCCESS){
puts(“can’trealize interface with the sepecified plugin”);
exit(1)
}
puts(“>>>ealling op4”);
puts(sec_1_2_op4(pin));
puts(“>>>calling op3”);
puts((char*)sec_1_2_op3(pin,”hello world!”));
puts(“>>>calling op4”);
puts(sec_L_2_op4(pin));
_e_pif_release(pin);
……
)
客户程序不需要指定实际的具体实现(尽管在这一例子中的确如此)。当不指定具体实现时,向客户提供用于那个接口的缺省具体实现。
功能设计说明
在这一部分中,将给出支持(a)具体实现继承和(b)无具体实现继承情形的接口过程的逐个功能的设计的例子。该例子设计支持接口继承,即使对引擎的所有实施例来说并不要求。这一特定的关键方面如下:
客户程序将实现的接口呈现为C结构,其成员变量是实现该接口的功能特征的具体实现的功能的指针,不管支持接口的具体实现是单态具体实现还是导出具体实现。客户程序不知道所实现的接口是原始接口还是混合或继承接口,反而将其看作单态接口。
接口方法调用将接口指针传递给插件程序实例作为第一自变量。
具体实现方法可以通过调用由PIF提供的_e_pif_this()功能,访问每个实例专用数据。
图12表示这一特定设计实施例的实现和具体实现过程。如图12所示,该过程包括实现阶段、拦截器阶段、加载和卸载阶段和释放阶段。下面将进一步论述。
_e_pif_realize()390
_e_pif_realize()功能390调用pif_init来初始化互斥锁定例程(互斥)。互斥是实施互斥政策的抽象结构。传统上,每次仅一个过程线程可以保持特定的互斥,以及试图锁定所保存的互斥的线程将被阻止直到解锁互斥为止。必须以与它们进入时相反的顺序退出互斥,并且它们在退出前不能再重新进入。
如果还没有实现登记插件程序,那么过程将试图实现它。为性能好处,能高速缓存登记插件程序的这一实例。使有效插件程序的计数递增以便反映新插件程序,然后解锁互斥。
由于过程不知道何时将不再需要框架,其跟踪在任一给定时间,有多少插件程序实例是有效的。无论何时该计数下降到零,释放高速缓存的记录插件程序。使用高速缓存用于优化仅当正实现其他插件程序时,当有至少一个有效插件程序实例时有用。如果设计模型是每次仅一个插件程序永远有效,那么每次将实现和释放记录插件程序。高速缓存记录插件程序的负面影响在于正使用的基础记录没有看见记录变化直到关闭和重新打开记录为止。
然后,过程调用realize_frontend功能392。如果不成功,那么锁定互斥,递减有效插件程序计数。如果有效计数达到零,那么释放记录插件程序(registry plugin),以及解锁互斥。
realize_frontend()392
该过程通过realize_front end功能392继续,作为第一步骤,使用所提供的自变量构造PIF_RARGS堆栈,并调用realize_internal 394。如果realize_internal找出单态插件程序值,那么返回相应的单态。如果realize_intrnal找出堆栈拦截器,那么返回堆栈中第一插件程序的句柄或指针。如果realize_internal返回除SUCCESS外任何其他值,那么返回错误。如果不满足上述任一标准,由其组件构造插件程序。realize_frontend功能循环过每个具体实现并验证主版本号,同时寻找最高次版本号和最大Vtbl大小。
验证步骤确保最高次版本号大于或等于所请求的。计算和分配所要求的存储器的大小块。为可变大小PIF-CONTROL块、代理Vtbl、扇出拦截器数组以及info_public指针的数组分配一个存储块。
作为通过循环遍每个具体实现的Vtbl的代理Vtbl,填充PIF-CONTROL块,以及用来自Vtbls的非空记录填充代理Vtbl的空记录。
对空记录检查所填充的代理Vtbl,以及如果找到的话,返回NORESOURCE错误。
realize-internal()394
一个另外的自变量是P表示为局部的IF_PINFO数据结构的数组。使用这一数组以便能首先例示组成整个插件程序的具体实现以便实现过程知道分配多大的动态存储块。这是由具体实现继承以及组成整个插件程序的所有具体实现内的最大Vtbl的大小确定的。因为在过程知道具体实现继承的实际深度前分配这一数组,框架可以将具体实现限定强加在所允许的具体实现继承的最大深度上。如果实际过程期间,达到这一极限,过程将失败并返回。
如果未指定具体实现标识符,那么首先读取的记录将是使用指定的接口标识符和接口的次版本号调用Getlntf400。如果Defaultimpl属性是非空,那么将其用作接口标识符。
如果未指定具体实现标识符以及如上所述的Defaultimpl属性为空,那么查看HighestMinorlmpl属性。
如果指定具体实现标识符,或由上述步骤确定一个,下一步骤是通过调用GetAlias 400查看标识符是否是选择符或别名。如果未找到匹配,那么具体实现标识符不是别名。如果找出匹配,那么现在所知道为别名的被用作属性名以及从记录读取其值。那么这一属性的值被用作具体实现标识符,但首先递归地检查以查看别名是否映射到另一别名上。
使用接口标识符自变量和最终具体实现标识符,在已经实现(以及还没有释放)的单态插件程序的列表检查其最早导出的实现的信息结构具有最适当的m_interface_id和m_impl_id字段的一个。如果找出匹配,那么在匹配插件程序上调用_ep_pf_dupref并返回新指针。当正例示的具体实现作为基本具体实现时,不执行对现有匹配单态的搜索。
使用最终的具体实现标识符,调用Getlmpl400。如果具体实现不存在,返回错误。除非所使用的标识符是最初由调用者指定的一个,在这种情况下,过程在顶部开始,似乎调用者还没有指定具体实现标识符。
realize_internal接着检查InterceptionType属性。如果这一属性表示除“Nolnterceptor”外的任何一个,那么调用处理拦截器的实现的内部例程。如果正实现的具体实现是在堆栈拦截序列中指定的一个,忽略这一步骤。
如果设置InterceptionType属性,那么过程调用realize_interceptor402。
如果InterceptionType为STACK,那么还将指针设置成下一堆栈成员。
使用ImagePath属性或implld,调用_e_dl_load功能。
使用EntryFunc属性或缺省的“_ep_dl_instantiate”,调用_e_dl_getfuncaddr功能398。然后调用插件程序的_ep_dl_instantiate功能。
用相应的具体实现专用信息结构初始化适当的info_public结构(PIFPINFO结构中的m_pinfo)。
_e_dl_unload()404
将ImagePath属性的值传递给_gp_dl_load。然后,将EntryFunc属性的值传递给_gp_dl_getfuncaddr 398以便获得插件程序的例示例程的地址。通过来自传递到_pe_pf_realize并内部生成的那些的适当的自变量调用例示例程。
realize_internal检查InheritsFrom属性。如果这一属性存在,那么其通过所述属性的值递归调用realize_internal。当通过框架实现时实现在InheritsFrom属性中指定的具体实现标识符,就象指定EF_PF_EXACT_MATCH标志一样。
只要控制由realize_internal返回到_pe_pf_realize,那么确定所需的Proxy Vtbl的大小,以及知道继承的深度。
同时,系统现有能检查以确定存在组成实现由调用程序请求的至少最低次版本号的整个插件程序的至少一个具体实现。这一检查通过查看每个具体实现的_e_pf_plugin_info数据结构来执行。如果这一检查失败,那么返回版本不匹配错误。
现在能分配PIF_CONTROL数据结构。PIF_PINFO数据结构的堆栈局部数组能被拷贝到m_pi字段。
现在还能填充Proxy Vtbl。从最早导出的具体实现开始以及以最后导出的具体实现结束,执行下述的过程。对每个非零记录,在Proxy Vtbl的相同偏移的有空指针的具体实现静态Vtbl中每个非空记录,将来自具体实现静态Vtbl的指针拷贝到Proxy Vtbl上。
检查Proxy Vtbl以便确保没有空指针。如果找出任何一个,那么释放任何一个并返回错误。
能通过简单地拷贝来自每个相应的字段,能初始化具体实现的专用“info”结构的相应字段PIF-CONTROL结构的m_pi字段的每个成员的m_publicinf字段。初始化由PIF_CONTROL结构的m_publicinfo字段所指的指针的矢量以便指向PIF_INFO结构(m_pi)的数组中的适当的m_publicinfo字段。
检查每个实现的信息数据结构以便查看是否设置m_singleton标志。如果每个具体实现具有所设置的这一标志,那么设置PIF-CONTROL结构中的PIF-SINGLETON标志。如果设置这一标志,那么使用m-nextsingleton指针,将PIF_CONTROL结构链接到单态插件程序的链接列表上。
realize_interceptor()402
客户程序或调用应用(调用程序)通过rdepth+1以及EXACT_MATCH和IGNORE_ISEQ调用序列中每个implld上的realize_frontend。
将返回的指针ip存储在PIF_RARGS结构中。如果其是Fan-out拦截型,那么将fanoutLen(PIFRARGS)设置成序列长度。对两种拦截型而言,当由框架实现时实现InterceptionSeq属性中指定的具体实现标识符,就象指定EF_PF_EXACT_MATCH标记一样。
对拦截器的FAN-OUT型,通过与最初调用_pe_pf_realize相同的自变量,调用realize-internal功能n次,除用来自序列的相应的一个代替具体实现标识符自变量外。N是序列中具体实现标识符的数量。然后再调用realize-internal功能,这次用实现的拦截插件程序的指针的序列。
对拦截器的STACK型,同样用与最初调用_pe_pf_realize相同的自变量,调用realize-internal功能n次。这次,向后遍历具体实现标识符的序列。另外,在每次调用realize-internal时,除第一次外,传递所实现的最后一个拦截插件程序的单态指针。如果在定义拦截器序列的记录关键上存在Imagepath属性,处理关键,就象它是堆栈拦截序列中的第一插件程序一样。
e_pif dupref()
在非深拷贝情况下,简单地递增存储在PIF-CONTROL数据结构中的参考计数并返回相同的指针。
在深拷贝的情况下,执行下述动作:分配新的PIF_CONTROL数据结构。
如果设置PIF_STACKI标志,那么在堆栈中的下一插件程序上调用_pe_pf_dupref406。将所返回的新指针保存在所分配的新的PIF_CONTROL数据结构的m_interceptors字段中。首先执行递归,因为在调用用于当前插件程序的任一具体实现的任一拷贝例程前,需要新堆栈中下一插件程序的指针。
如果设置PIF_FANOUTI标志,那么在扇出拦截序列和存储在新PIF-CONTROL数据结构的相应字段中的返回的指针中的每个插件程序上调用_e_pf_dupref 406。首先执行这一递归,因为在调用用于当前插件程序的任一具体实现的任一拷贝例程前,需要新序列。
由最初的PIF_CONTROL数据结构填充新的PIF-CONTROL数据结构,以及将新PIF-CONTROL的参考计数设置为1。使用新PIF-CONTROL数据结构,调用插件程序的拷贝例程(用其_e_pf_plugin_info数据结构所指的)。在具体实现继承的情况下,继承列表中的每个插件程序具有所调用的拷贝例程。
_e_PIF_release()396
递减PIF-CONTROL数据结构中的参考计数,以及如果在递减后的计数大于零(0),那么简单地返回它。
当参考计数到达0时所做的第一件事是调用插件程序破坏例程,以便其能释放任一资源。在具体实现继承的情况下,首先调用最先导出的具体实现的破坏例程。
如果正释放的插件程序是堆栈拦截器链的一部分,那么在链中的下一插件程序中递归地调用_pe_pf_release。
如果所释放的插件程序是扇出插件程序,那么释放相应的拦截插件程序的每一个。
如果在PIF_CONTROL数据结构中设置PIF-SINGLETON标志,那么检查所实现的单态插件程序的链接列表以便查看这一插件程序是否在那个列表上,以及如果是的话,从那个列表移出。
最后,卸载动态库句柄404,然后释放PIF-CONTROL数据结构。
当有效插件程序的计数达到零时,释放高速缓存的记录插件程序参考。
如果设置释放标志,那么在下一堆栈拦截器(如果有的话)上以及在扇出拦截插件程序的序列上调用_e_pif_release功能。
_e_pif_this()
然后该过程通过PIF_CONTROL中的PlF_PINFO的数组简单地索引,查看其pVtbl实例句柄是否与传递的匹配。如果找出匹配,返回相应的pPrivData。
_e_pif_interception_seq()
返回PIF_CONTROL中的m_interceptors字段的指针。
_e_pif_getinfo()
返回来自PIF_CONTROL的公用信息指针的数组的长度和指针。
对本领域的技术人员来说,尽管在此描述的一些功能和例程特定为具有符合一些规则的某些特性、特征和限制,不必全部或部分坚持这些规则以便操作本发明,以及所给出的例子用于示例说明本发明的实施例的目的是很显然的。
实例开发
图13示例说明在典型的客户/服务器环境中,开发发明的方法的例子的流程图。如步骤370中所示,由开发商或管理员指定用于由服务器提供的每个接口的一组服务。在步骤372中,为每个接口开发具体实现以便满足那个接口的特定服务需要。在步骤374中,不同的实体,诸如其他开发商和第三方卖主开发用于那个接口的不同的具体实现,设置具有不同特性的每个具体实现。在步骤376,调用应用或客户访问服务器引擎并请求特定的具体实现类型。在步骤378,客户要求调用_e_pif_realize以实现所需接口。在这一过程中,接口唯一标识符被生成并指定给客户。然后客户可以选择(380,根据其结构)用于这一具体实现类型的缺省具体实现插件程序,或另外的具体实现插件程序(例如,客户可以特别地请求“AlternateVersion”命名的具体实现)。客户接收句柄(在一情况下,可以是以客户能存储在客户应用程序本身中的令牌或cookie的形式,用于以后使用(382))。句柄用作由具体实现填充的Vtable数据空间内的指针,并因此进入服务具体实现本身。
为示例和描述目的,已经提供了本发明的优选实施例的上述描述。不打算排斥或将本发明限定到所公开的精确的形式。很显然,对本领域的技术人员来说很多修改和改进将是显而易见的。选择和描述这些实施例以便最好地解释本发明的原理及其实际应用,从而允许本领域的其他技术人员理解用于各个实施例以及具有适合于所期望的特定使用的各种改进的本发明。规定本发明的范围由下面的权利要求书及其等效来限定。
Claims (52)
1.一种用于允许客户应用程序与服务器组件应用程序通信的框架体系结构系统,包括:
服务器,其具有用于向服务器提供客户应用程序访问的服务器引擎,所述服务器引擎进一步包括:
用于提供服务的服务器组件;
用于提供所述服务的功能的所述服务器组件内的具体实现,该具体
实现保持通过其功能的地址或指向其功能的指针来填充的虚拟功能表,
并且其中所述具体实现动态链接和加载到所述服务器引擎中;
用于允许客户应用程序访问所述具体实现的接口机制;
用于允许客户应用程序与接口和具体实现进行通信的实现机制;
其中所述实现机制响应于来自客户应用程序的请求,通过定位指定的具体实现和访问存储在具体实现的虚拟功能表中的信息以创建用指向具体实现的功能的地址的指针来填充的代理虚拟功能表并将指向代理虚拟功能表的指针返回至客户端应用程序,来实现接口;和
其中所述客户应用程序使用所述指针与所述接口和具体实现进行通信。
2.如权利要求1所述的框架体系结构系统,其特征在于,所述服务器组件包括多个具体实现,以及其中,所述接口机制允许所述客户应用程序选择和访问一个所述插件程序具体实现。
3.如权利要求1所述的框架体系结构系统,其特征在于,所述具体实现是插件程序具体实现并能在运行时用另一具体实现来代替。
4.如权利要求1所述的框架体系结构系统,其特征在于,所述接口提供用于由所述服务器组件的所述具体实现提供的功能的接口定义说明。
5.如权利要求4所述的框架体系结构系统,其特征在于,所述接口根据所述接口定义,显示数据类型结构,其中所述数据类型结构的每个成员是实现由所述接口定义的服务的具体实现功能的功能指针。
6.如权利要求1所述的框架体系结构系统,进一步包括:
包含用于每个接口以及接口标识符的记录的接口名称空间。
7.如权利要求1所述的框架体系结构系统,其特征在于,每个接口与所述接口的版本相关。
8.如权利要求1所述的框架体系结构系统,其特征在于,存在用于所述接口的多个具体实现。
9.如权利要求1所述的框架体系结构系统,其特征在于,存在提供用于所述服务器组件的相同具体实现的多个接口。
10.如权利要求1所述的框架体系结构系统,其特征在于,所述具体实现从相同接口的另一具体实现继承接口方法和功能的子集。
11.如权利要求3所述的框架体系结构系统,其特征在于,具体实现被插入所述引擎中并通过注册过程从所述引擎中消除。
12.如权利要求1所述的框架体系结构系统,其特征在于,所述具体实现在运行时被存储在由引擎加载的容器中。
13.如权利要求12所述的框架体系结构系统,其特征在于,所述容器是动态可加载库。
14.如权利要求12所述的框架体系结构系统,其特征在于,所述容器包含多个插件程序。
15.如权利要求1所述的框架体系结构系统,其特征在于,所述具体实现可以包括用于将服务增加到所述服务器组件上的拦截器。
16.如权利要求15所述的框架体系结构系统,其特征在于,所述拦截器是在例示接口具体实现期间,使得也将例示按由拦截序列属性指定的多个拦截插件程序的扇出拦截器,其中,客户程序的随后的方法调用导致按指定的顺序调用拦截插件程序的相应的方法。
17.如权利要求15所述的框架体系结构系统,其特征在于,所述拦截器是在实现接口具体实现期间,使得将依次例示拦截序列中的每个插件程序的堆栈拦截器。
18.如权利要求1所述的框架体系结构系统,进一步包括用于永久存储具体实现的记录。
19.如权利要求1所述的框架体系结构系统,进一步包括用于客户应用程序实现具体实现的实现机制,其中,所述具体实现包括虚拟功能表、专用数据库以及每个实例数据结构。
20.如权利要求19所述的框架体系结构系统,其特征在于,实现机制包括用于检索存储在插件程序的虚拟功能表、专用数据库以及每个实例数据结构内的信息、将所述信息拷贝到代理虚拟功能表,并将代理虚拟功能表的指针返回给客户程序的逻辑。
21.如权利要求20所述的框架体系结构系统,其特征在于,客户程序使用这一指针以便此后与接口具体实现通信。
22.如权利要求1所述的框架体系结构系统,其特征在于,所述具体实现是软件个性化。
23.如权利要求22所述的框架体系结构系统,其特征在于,所述软件个性化是Tuxedo、Jolt和AMS中的一个。
24.如权利要求23所述的框架体系结构系统,其特征在于,所述个性化包括编程姿态。
25.如权利要求24所述的框架体系结构系统,其特征在于,所述编程姿态是C、OLE或Cobol中的一个。
26.如权利要求1所述的框架体系结构系统,其特征在于,所述具体实现是软件扩展。
27.一种允许客户应用程序经框架体系结构与服务器应用程序通信的方法,包括步骤:
提供服务器引擎,用于向服务器提供客户应用程序访问,所述服务器引擎进一步包括:
用于提供服务的服务器组件;
用于提供所述服务的功能的所述服务器组件内的具体实现,该具体实现保持通过其功能的地址或指向其功能的指针来填充的虚拟功能表,并且其中所述具体实现动态链接和加载到所述服务器引擎中;
用于允许客户应用程序访问所述具体实现的接口机制;
用于允许客户应用程序与接口和具体实现进行通信的实现机制;
其中所述实现机制响应于来自客户应用程序的请求,通过定位指定的具体实现和访问存储在具体实现的虚拟功能表中的信息以创建用指向具体实现的功能的地址的指针来填充的代理虚拟功能表并将指向代理虚拟功能表的指针返回至客户端应用程序,来实现接口;和
其中所述客户应用程序使用所述指针与所述接口和具体实现进行通信。
28.如权利要求27所述的方法,进一步包括:
允许所述客户应用程序选择和访问由所述接口提供的多个插件程序具体实现中的一个。
29.如权利要求27所述的方法,其特征在于,所述具体实现是插件程序具体实现并在运行时能由另一具体实现代替。
30.如权利要求27所述的方法,其特征在于,所述接口提供用于由所述服务器组件的所述具体实现提供的功能的接口定义说明。
31.如权利要求30的方法,其特征在于,所述接口根据所述接口定义,显示数据类型结构,其中所述数据类型结构的每个成员是实现由所述接口定义的服务的具体实现功能的功能指针。
32.如权利要求27所述的方法,进一步包括:
维护包含用于每个接口以及接口标识符的记录的接口名称空间。
33.如权利要求27所述的方法,其特征在于,将每个接口与所述接口的版本关联。
34.如权利要求27所述的方法,其特征在于,存在用于所述接口的多个具体实现。
35.如权利要求27所述的方法,其特征在于,存在提供用于所述服务器组件的相同具体实现的多个接口。
36.如权利要求27所述的方法,其特征在于,所述具体实现从相同接口的另一具体实现继承接口方法和功能的子集。
37.如权利要求29的方法,进一步包括:
经注册过程将具体实现登记所述引擎内的插件程序。
38.如权利要求27所述的方法,其特征在于,所述具体实现在运行时被存储在由引擎加载的容器中。
39.如权利要求38所述的方法,其特征在于,所述容器是动态可加载库。
40.如权利要求38所述的方法,其特征在于,所述容器包含多个插件程序。
41.如权利要求27所述的方法,进一步包括:
将所述具体实现功能与将服务增加到所述服务器组件上的拦截器结合。
42.如权利要求41所述的方法,其特征在于,所述拦截器是扇出拦截器,其在例示接口具体实现期间,包括下述步骤:
使得也将例示按由拦截序列属性指定的多个拦截插件程序,其中,客户程序的随后的方法调用导致按指定的顺序调用拦截插件程序的相应的方法。
43.如权利要求41所述的方法,其特征在于,所述拦截器是堆栈拦截器,其在实现接口具体实现期间,包括下述步骤:
使得将依次例示拦截序列中的每个插件程序。
44.如权利要求27所述的方法,进一步包括在记录内存储具体实现。
45.如权利要求27所述的方法,进一步包括:
提供用于允许客户应用程序实现具体实现的实现机制,其中,所述具体实现包括虚拟功能表、专用数据库以及每个实例数据结构。
46.如权利要求45所述的方法,进一步包括:
检索存储在插件程序的虚拟功能表、专用数据库以及每个实例数据结构内的信息、将所述信息拷贝到代理v表,并将代理v表的指针返回给客户程序的逻辑。
47.如权利要求46所述的方法,进一步包括:
使用所述指针以便此后与接口具体实现通信。
48.如权利要求27所述的方法,其特征在于,所述具体实现是软件个性化。
49.如权利要求48所述的方法,其特征在于,所述软件个性化是Tuxedo、Jolt和AMS中的一个。
50.如权利要求49所述的方法,其特征在于,所述个性化包括编程姿态。
51.如权利要求50所述的方法,其特征在于,所述编程姿态是C、OLE或Cobol中的一个。
52.如权利要求27所述的方法,其特征在于,所述具体实现是软件扩展。
Applications Claiming Priority (5)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US29446701P | 2001-05-30 | 2001-05-30 | |
US60/294,467 | 2001-05-30 | ||
US09/918,880 | 2001-07-31 | ||
US09/918,880 US6996832B2 (en) | 2001-05-30 | 2001-07-31 | System and method for software component plug-in framework |
PCT/US2002/016425 WO2002097610A1 (en) | 2001-05-30 | 2002-05-28 | System and method for software component plug-in framework |
Publications (2)
Publication Number | Publication Date |
---|---|
CN1524216A CN1524216A (zh) | 2004-08-25 |
CN1318956C true CN1318956C (zh) | 2007-05-30 |
Family
ID=26968540
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CNB028136012A Expired - Lifetime CN1318956C (zh) | 2001-05-30 | 2002-05-28 | 软件构件插件程序结构的系统和方法 |
Country Status (5)
Country | Link |
---|---|
US (2) | US6996832B2 (zh) |
EP (1) | EP1405172A4 (zh) |
JP (1) | JP2004534304A (zh) |
CN (1) | CN1318956C (zh) |
WO (1) | WO2002097610A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106060063A (zh) * | 2016-06-24 | 2016-10-26 | 武汉斗鱼网络科技有限公司 | 一种用于互联网网站前端逻辑入口的过滤方法及装置 |
Families Citing this family (125)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7287277B2 (en) * | 2001-12-21 | 2007-10-23 | Hewlett-Packard Development Company, L.P. | Method and apparatus for controlling execution of a computer operation |
US7246350B2 (en) * | 2002-01-07 | 2007-07-17 | Intel Corporation | Dynamic composition and maintenance of applications |
US7516447B2 (en) | 2002-02-22 | 2009-04-07 | Bea Systems, Inc. | Methods and apparatus for building, customizing and using software abstractions of external entities |
WO2003098374A2 (en) * | 2002-05-17 | 2003-11-27 | Koninklijke Philips Electronics N.V. | Rendering a first media type content on a browser |
US7386877B2 (en) * | 2002-07-12 | 2008-06-10 | Sun Microsystems, Inc. | Specifying a repository for an authentication token in a distributed computing system |
US20040045007A1 (en) * | 2002-08-30 | 2004-03-04 | Bae Systems Information Electronic Systems Integration, Inc. | Object oriented component and framework architecture for signal processing |
US20040045009A1 (en) * | 2002-08-29 | 2004-03-04 | Bae Systems Information Electronic Systems Integration, Inc. | Observation tool for signal processing components |
US7765521B2 (en) * | 2002-08-29 | 2010-07-27 | Jeffrey F Bryant | Configuration engine |
CN1270229C (zh) * | 2002-12-31 | 2006-08-16 | 上海科泰世纪科技有限公司 | 基于动态内核实现跨地址空间创建构件对象的方法 |
US7406695B2 (en) * | 2003-01-17 | 2008-07-29 | Sap Aktiengesellschaft | Automatically upgradeable extension of software |
AU2004206357A1 (en) * | 2003-01-23 | 2004-08-05 | Electronic Data Systems Corporation | Plug and play architecture for composing configuring deploying and managing services |
US7783499B2 (en) | 2003-03-03 | 2010-08-24 | International Business Machines Corporation | Framework for dynamic composition of web services |
EP1475611B1 (en) * | 2003-05-07 | 2007-07-11 | Harman/Becker Automotive Systems GmbH | Method and application apparatus for outputting speech, data carrier comprising speech data |
WO2005008482A1 (en) * | 2003-07-11 | 2005-01-27 | Computer Associates Think, Inc. | System and method for providing a generic graphical user interface framework |
US7861243B2 (en) * | 2003-07-11 | 2010-12-28 | Computer Associates Think, Inc. | Automatically deploying program units to a cluster of networked servers |
JP2005128596A (ja) | 2003-10-21 | 2005-05-19 | Sony Corp | 情報処理装置および方法、記録媒体、プログラム、並びにコンテンツ関連データ |
CN100365568C (zh) * | 2004-01-06 | 2008-01-30 | 英业达股份有限公司 | Java小应用程序下插件功能的实现方法 |
GB0407150D0 (en) * | 2004-03-30 | 2004-05-05 | British Telecomm | Distributed computer |
CN1307549C (zh) * | 2004-05-15 | 2007-03-28 | 浙江大学 | 支持普适计算的构件管理方法 |
US20050278279A1 (en) * | 2004-05-28 | 2005-12-15 | Petev Petio G | Native libraries descriptor with reference counting |
US7509638B2 (en) | 2004-08-02 | 2009-03-24 | International Business Machines Corporation | Method and apparatus for providing a pluggable and extendable J2EE architecture |
US20060095332A1 (en) * | 2004-09-30 | 2006-05-04 | Sap Aktiengesellschaft | System and method for providing access to an application through a common interface for application extensions |
US7735076B2 (en) * | 2004-10-15 | 2010-06-08 | Adobe Systems Incorporated | Faster loading of extension-based applications using caching |
US8185555B2 (en) * | 2004-10-22 | 2012-05-22 | International Business Machines Corporation | Model extension framework |
US20060101091A1 (en) * | 2004-10-22 | 2006-05-11 | International Business Machines Corporation | Recovering references in an extended model |
US7512699B2 (en) * | 2004-11-12 | 2009-03-31 | International Business Machines Corporation | Managing position independent code using a software framework |
US20060195586A1 (en) * | 2005-02-25 | 2006-08-31 | Microsoft Corporation | Sessions and terminals configured for binding in an extensible manner |
US7984119B2 (en) * | 2005-04-21 | 2011-07-19 | Sap Ag | Template configuration tool for application servers |
JP4855710B2 (ja) * | 2005-04-28 | 2012-01-18 | 株式会社東芝 | ソフトウェアのプラグイン方法、および、アプリケーションプログラム |
US7698685B2 (en) * | 2005-10-12 | 2010-04-13 | Microsoft Corporation | Discovery, qualification, and activation of software add-in components |
US8386555B2 (en) * | 2005-11-04 | 2013-02-26 | Sap Ag | Systems and methods for adapting procedure calls to service providers |
US20080005168A1 (en) * | 2006-06-30 | 2008-01-03 | Microsoft Corporation | Managing family information |
US7590951B1 (en) * | 2006-08-08 | 2009-09-15 | Xilinx, Inc. | Plug-in component-based dependency management for partitions within an incremental implementation flow |
US8762940B2 (en) * | 2006-08-30 | 2014-06-24 | Ati Technologies Inc. | Drag and drop utilities |
US9081589B2 (en) * | 2006-12-01 | 2015-07-14 | Adobe Systems Incorporated | Persistent web plug-ins |
JP4986598B2 (ja) * | 2006-12-14 | 2012-07-25 | キヤノン株式会社 | アプリケーション管理システム及びその制御方法 |
US7620927B1 (en) | 2006-12-15 | 2009-11-17 | Xilinx, Inc. | Method and apparatus for circuit design closure using partitions |
US8307379B2 (en) * | 2006-12-21 | 2012-11-06 | International Business Machines Corporation | Determining an extension to use to process an input object to a call in a program |
US8499276B2 (en) * | 2006-12-28 | 2013-07-30 | Ca, Inc. | Multi-platform graphical user interface |
US7996787B2 (en) * | 2007-02-06 | 2011-08-09 | Cptn Holdings Llc | Plug-in architecture for window management and desktop compositing effects |
WO2008101049A2 (en) * | 2007-02-14 | 2008-08-21 | Datacard Corporation | Framework for enhanced production of personalized documents |
US8793676B2 (en) * | 2007-02-15 | 2014-07-29 | Microsoft Corporation | Version-resilient loader for custom code runtimes |
US20080229288A1 (en) * | 2007-03-13 | 2008-09-18 | Steve Nelson | Software Plugin Modules for Device Testing |
US8276167B2 (en) * | 2007-03-21 | 2012-09-25 | International Business Machines Corporation | Distributed pluggable middleware services |
US7865914B2 (en) * | 2007-03-29 | 2011-01-04 | Microsoft Corporation | Cooperative DLL unload |
US9274847B2 (en) * | 2007-05-04 | 2016-03-01 | Microsoft Technology Licensing, Llc | Resource management platform |
US7716399B2 (en) * | 2007-05-25 | 2010-05-11 | Red Hat, Inc. | Method and system for data management interface with intelligent plugins that determine whether to perform the requested data operation received from an application |
US7856517B2 (en) * | 2007-05-25 | 2010-12-21 | Red Hat, Inc. | Data management interface with configurable plugins that determines whether to monitor for configuration data |
US8898277B2 (en) * | 2007-06-08 | 2014-11-25 | Oracle International Corporation | Performance monitoring infrastructure for distributed transaction service |
KR100911324B1 (ko) * | 2007-06-22 | 2009-08-07 | 삼성전자주식회사 | 가변성 요소 관리 방법 및 그 장치 |
US7917887B2 (en) * | 2007-06-28 | 2011-03-29 | Microsoft Corporation | DDEX (data designer extensibility) default object implementations for software development processes |
US8769291B2 (en) * | 2007-07-23 | 2014-07-01 | Red Hat, Inc. | Certificate generation for a network appliance |
CN101387956B (zh) * | 2007-09-14 | 2012-08-29 | 国际商业机器公司 | 可扩展地实现非功能逻辑的方法和设备及其系统 |
US20090085572A1 (en) * | 2007-09-28 | 2009-04-02 | Mcguire Jeffrey D | Method and apparatus for diagnosing inverter linkages |
US8732236B2 (en) * | 2008-12-05 | 2014-05-20 | Social Communications Company | Managing network communications between network nodes and stream transport protocol |
US20100050093A1 (en) * | 2007-10-26 | 2010-02-25 | Telcordia Technologies, Inc. | Collaborative Panel Adminstrator |
US8621027B2 (en) | 2007-11-16 | 2013-12-31 | Red Hat, Inc. | Automatically providing identity information for a network appliance |
US8191123B2 (en) * | 2007-11-27 | 2012-05-29 | Red Hat, Inc. | Provisioning a network appliance |
US8191122B2 (en) * | 2007-11-27 | 2012-05-29 | Red Hat, Inc. | Provisioning a network appliance |
EP2088506A1 (en) * | 2008-02-06 | 2009-08-12 | Software AG | Method and system for calling services from a remote client |
US8601443B2 (en) * | 2008-02-12 | 2013-12-03 | International Business Machines Corporation | Method and system for correlating trace data |
US8510753B2 (en) | 2008-06-27 | 2013-08-13 | Microsoft Corporation | Untrusted component hosting |
US8789071B2 (en) * | 2008-10-09 | 2014-07-22 | International Business Machines Corporation | Integrated extension framework |
KR20130010911A (ko) * | 2008-12-05 | 2013-01-29 | 소우셜 커뮤니케이션즈 컴퍼니 | 실시간 커널 |
GB2466220A (en) * | 2008-12-12 | 2010-06-16 | Symbian Software Ltd | Installing or uninstalling computer programs using installer plug-in modules |
US8495565B2 (en) | 2009-01-09 | 2013-07-23 | Nec Corporation | Service providing apparatus, service providing system, service providing method, and storage medium |
JP2010204840A (ja) * | 2009-03-02 | 2010-09-16 | Nippon Telegr & Teleph Corp <Ntt> | ユーザインターフェース操作統合システムのカスタマイズ方法及び端末装置並びにコンピュータプログラム及び情報記録媒体 |
US8776027B2 (en) * | 2009-03-06 | 2014-07-08 | Microsoft Corporation | Extracting and collecting platform use data |
WO2010120549A2 (en) * | 2009-03-31 | 2010-10-21 | Ecrio, Inc. | System, method and apparatus for providing functions to applications on a digital electronic device |
US8250589B2 (en) * | 2009-04-03 | 2012-08-21 | Lsi Corporation | Method for simplifying interfaces having dynamic libraries |
CN101571809B (zh) * | 2009-05-14 | 2012-08-22 | 阿里巴巴集团控股有限公司 | 一种插件注册的实现方法及其装置 |
CN101604371B (zh) * | 2009-07-22 | 2012-02-08 | 阿里巴巴集团控股有限公司 | 插件权限的控制方法及系统 |
US8060861B2 (en) * | 2009-07-27 | 2011-11-15 | Charles Swires | Tool to generate active page interface instructions |
US10089119B2 (en) * | 2009-12-18 | 2018-10-02 | Microsoft Technology Licensing, Llc | API namespace virtualization |
US8407461B2 (en) | 2010-12-17 | 2013-03-26 | Oracle International Corporation | Plug-in system for software applications |
WO2012118917A2 (en) | 2011-03-03 | 2012-09-07 | Social Communications Company | Realtime communications and network browsing client |
US8776094B2 (en) | 2011-08-11 | 2014-07-08 | Microsoft Corporation | Runtime system |
US8695021B2 (en) | 2011-08-31 | 2014-04-08 | Microsoft Corporation | Projecting native application programming interfaces of an operating system into other programming languages |
US10228986B2 (en) | 2011-09-29 | 2019-03-12 | Agiledelta, Inc. | Interface-adaptive data exchange |
US8863129B2 (en) | 2011-12-06 | 2014-10-14 | International Business Machines Corporation | Automated caching and mirroring of immutable data in distributed virtual machines via native interface components |
EP2823411A4 (en) * | 2012-03-10 | 2015-12-09 | Evado Holdings Pty Ltd | METHOD AND SYSTEM FOR THE APPLICATION DEVELOPMENT OF MULTI-DEVICE CLIENT PLATFORMS |
CN105094888B (zh) * | 2012-03-29 | 2018-12-07 | 北京奇虎科技有限公司 | 一种应用程序插件加载方法及装置 |
US10282196B2 (en) * | 2012-04-06 | 2019-05-07 | Oracle International Corporation | System and method for moving enterprise software application components across environments |
US8910138B2 (en) | 2012-05-23 | 2014-12-09 | Oracle International Corporation | Hot pluggable extensions for access management system |
CN103491111B (zh) * | 2012-06-08 | 2016-12-14 | 阿里巴巴集团控股有限公司 | 无线应用发布、实现方法与装置 |
US8856740B2 (en) * | 2012-07-31 | 2014-10-07 | Hewlett-Packard Development Company, L.P. | Implementing multiple versions of a plug-in concurrently |
US9348490B2 (en) | 2012-09-14 | 2016-05-24 | Ca, Inc. | User interface with configuration, registration, and runtime selection of views |
US20140164556A1 (en) * | 2012-12-11 | 2014-06-12 | Dealbase, Inc. | Method and system for live loading of a toolbar |
US9110758B2 (en) | 2013-03-15 | 2015-08-18 | Western Digital Technologies, Inc. | Cross-platform software framework for embedded systems on data storage device |
CN103268229A (zh) * | 2013-05-31 | 2013-08-28 | 重庆大学 | 一种可扩展管理层级的信息管理系统构建方法 |
US20140366045A1 (en) * | 2013-06-07 | 2014-12-11 | Microsoft Corporation | Dynamic management of composable api sets |
US9875605B2 (en) | 2013-09-26 | 2018-01-23 | Bally Gaming, Inc. | Separately served user interface for mobile gaming |
US9274790B2 (en) | 2014-04-30 | 2016-03-01 | Oracle International Corporation | Customization manager |
GB2530472A (en) * | 2014-05-21 | 2016-03-30 | Euronet Usa Llc | Financial switching engine |
CN105335187B (zh) | 2014-08-14 | 2019-12-13 | 阿里巴巴集团控股有限公司 | 一种应用的处理方法及装置 |
US9575744B2 (en) | 2014-09-26 | 2017-02-21 | Oracle International Corporation | Live updating of a shared plugin registry with no service loss for active users |
US10635504B2 (en) | 2014-10-16 | 2020-04-28 | Microsoft Technology Licensing, Llc | API versioning independent of product releases |
US9483327B2 (en) * | 2014-11-12 | 2016-11-01 | Vormetric, Inc. | Mechanism for interposing on operating system calls |
CN108563429B (zh) * | 2014-12-10 | 2021-06-29 | Oppo广东移动通信有限公司 | 描述插件安装包的方法及移动终端 |
CN105242976A (zh) * | 2015-09-17 | 2016-01-13 | 上海寰信网络信息技术有限公司 | 一种程序中逻辑单元之间数据传输的方法与系统 |
US9465714B1 (en) | 2015-09-22 | 2016-10-11 | International Business Machines Corporation | Adaptive runtime for a multiprocessing API |
CN105224375A (zh) * | 2015-11-12 | 2016-01-06 | 用友网络科技股份有限公司 | 管理系统插件的监控系统和方法 |
US11550632B2 (en) * | 2015-12-24 | 2023-01-10 | Intel Corporation | Facilitating efficient communication and data processing across clusters of computing machines in heterogeneous computing environment |
US9733999B1 (en) | 2016-03-24 | 2017-08-15 | Wells Fargo Bank, N.A. | Dynamic optimization of application workflows |
CN105847446B (zh) * | 2016-05-31 | 2020-08-04 | 腾讯科技(深圳)有限公司 | 一种网络数据的获取方法、装置和系统 |
CN106130759B (zh) * | 2016-06-22 | 2021-02-09 | 白杨 | 面向服务的模块化系统体系架构 |
CN106817247A (zh) * | 2016-12-17 | 2017-06-09 | 福建瑞之付微电子有限公司 | 一种适应于多种通讯链路的统一的数据通讯软件框架 |
CN110300958B (zh) * | 2017-01-13 | 2023-04-18 | 甲骨文国际公司 | 用于分布式事务中间件环境中的条件调用路径监视的系统和方法 |
CN106933651B (zh) * | 2017-03-14 | 2020-10-16 | 深圳市茁壮网络股份有限公司 | 一种更换js引擎的方法及装置 |
JP6873868B2 (ja) * | 2017-08-23 | 2021-05-19 | 株式会社日立製作所 | データ分析処理支援装置、及びデータ分析処理支援方法 |
CN110083520B (zh) * | 2018-01-25 | 2022-09-13 | 迈普通信技术股份有限公司 | 数据获取方法及装置 |
US11822680B1 (en) * | 2018-03-26 | 2023-11-21 | Ionic Security Inc. | Systems and methods for secured computer operations |
US11418621B2 (en) * | 2018-09-21 | 2022-08-16 | Microsoft Technology Licensing, Llc | Cloud-based composable data layer |
CN109614167B (zh) * | 2018-12-07 | 2023-10-20 | 杭州数澜科技有限公司 | 一种管理插件的方法和系统 |
CN109947407B (zh) * | 2019-03-07 | 2022-07-26 | 腾讯科技(北京)有限公司 | 一种数据获取方法及装置 |
US10983842B2 (en) | 2019-07-08 | 2021-04-20 | Microsoft Technology Licensing, Llc | Digital signal processing plug-in implementation |
CN110704124A (zh) * | 2019-09-19 | 2020-01-17 | 国云科技股份有限公司 | 一种流数据结构化处理系统及方法 |
CN112667306A (zh) * | 2019-10-15 | 2021-04-16 | 华为终端有限公司 | 安装插件的方法、装置和存储介质 |
CN111063432B (zh) * | 2019-12-13 | 2024-04-16 | 深圳开立生物医疗科技股份有限公司 | 一种超声数据处理方法、装置及超声设备和存储介质 |
KR20210107200A (ko) | 2020-02-21 | 2021-09-01 | 삼성디스플레이 주식회사 | 표시 장치 |
CN111506366B (zh) * | 2020-04-17 | 2023-09-05 | 咪咕文化科技有限公司 | 插件调用方法、装置、电子设备与存储介质 |
US11445148B1 (en) | 2021-05-06 | 2022-09-13 | Microsoft Technology Licensing, Llc | Video teleconference curated user profile picture |
US20220391224A1 (en) * | 2021-06-03 | 2022-12-08 | Samsung Electronics Co., Ltd. | Plugin framework mechanism to manage computational storage devices |
CN113821272B (zh) * | 2021-09-23 | 2023-09-12 | 武汉深之度科技有限公司 | 一种应用程序运行方法、计算设备及存储介质 |
KR102616785B1 (ko) * | 2022-12-13 | 2023-12-27 | 쿠팡 주식회사 | 전자 장치 및 그의 정보 제공 방법 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5893106A (en) * | 1997-07-11 | 1999-04-06 | International Business Machines Corporation | Object oriented server process framework with interdependent-object creation |
US6006279A (en) * | 1997-01-21 | 1999-12-21 | Canon Information Systems, Inc. | Plug-in module host framework |
Family Cites Families (25)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5404525A (en) * | 1992-09-30 | 1995-04-04 | International Business Machines Corporation | Efficient method router that supports multiple simultaneous object versions |
EP0669020B1 (en) * | 1992-11-13 | 1997-04-02 | Microsoft Corporation | Methods for marshalling interface pointers for remote procedure calls |
US5375241A (en) * | 1992-12-21 | 1994-12-20 | Microsoft Corporation | Method and system for dynamic-link library |
US5506984A (en) * | 1993-06-30 | 1996-04-09 | Digital Equipment Corporation | Method and system for data retrieval in a distributed system using linked location references on a plurality of nodes |
SE502423C2 (sv) * | 1994-02-15 | 1995-10-16 | Ellemtel Utvecklings Ab | System för hantering av interaktion mellan tilläggstjänster i ett telekommunikationssystem |
US5732270A (en) * | 1994-09-15 | 1998-03-24 | Visual Edge Software Limited | System and method for providing interoperability among heterogeneous object systems |
JP3072709B2 (ja) * | 1994-11-21 | 2000-08-07 | インターナショナル・ビジネス・マシーンズ・コーポレ−ション | 要求伝達方法 |
US5822580A (en) | 1996-01-19 | 1998-10-13 | Object Technology Licensing Corp. | Object oriented programming based global registry system, method, and article of manufacture |
US5838910A (en) * | 1996-03-14 | 1998-11-17 | Domenikos; Steven D. | Systems and methods for executing application programs from a memory device linked to a server at an internet site |
US5872966A (en) * | 1996-05-10 | 1999-02-16 | Apple Computer, Inc. | System and method for logging and enabling further manipulation of system state information |
US6208952B1 (en) * | 1996-10-24 | 2001-03-27 | Microsoft Corporation | Method and system for delayed registration of protocols |
US5884316A (en) * | 1996-11-19 | 1999-03-16 | Microsoft Corporation | Implicit session context system with object state cache |
US6356957B2 (en) * | 1997-04-03 | 2002-03-12 | Hewlett-Packard Company | Method for emulating native object oriented foundation classes on a target object oriented programming system using a template library |
USH1853H (en) * | 1998-02-19 | 2000-06-06 | Dsc/Celcore, Inc. | Universal client engine for a client-server environment |
CA2236064A1 (en) * | 1998-04-28 | 1999-10-28 | Ibm Canada Limited - Ibm Canada Limitee | Method and system for constructing hybrid virtual function tables |
US6222916B1 (en) * | 1998-05-22 | 2001-04-24 | Telefonaktiebolaget Lm Ericsson (Publ) | Method and apparatus for introducing and modifying telecommunications services |
US6442620B1 (en) * | 1998-08-17 | 2002-08-27 | Microsoft Corporation | Environment extensibility and automatic services for component applications using contexts, policies and activators |
US7523471B1 (en) | 1998-12-18 | 2009-04-21 | Siemens Aktiengesellschaft | Interpretive network daemon implemented by generic main object |
AU3352500A (en) * | 1999-01-29 | 2000-08-18 | Iona Technologies Inc. | Method and system for dynamic configuration of interceptors in a client-server environment |
US6757720B1 (en) * | 1999-05-19 | 2004-06-29 | Sun Microsystems, Inc. | Profile service architecture |
US6634008B1 (en) * | 1999-06-20 | 2003-10-14 | Fujitsu Limited | Methodology server based integrated circuit design |
US7096252B1 (en) * | 2000-10-05 | 2006-08-22 | Stmicroelectronics, Inc. | System and method for interfacing network station subsystems |
US7424717B2 (en) * | 2002-05-01 | 2008-09-09 | Bea Systems, Inc. | Systems and methods for business process plug-in development |
US7627631B2 (en) * | 2002-05-02 | 2009-12-01 | Bea Systems, Inc. | Systems and methods for collaborative business plug-ins |
US20040111525A1 (en) * | 2002-12-09 | 2004-06-10 | International Business Machines Corporation | Dynamic web service implementation discovery and selection apparatus and method |
-
2001
- 2001-07-31 US US09/918,880 patent/US6996832B2/en not_active Expired - Lifetime
-
2002
- 2002-05-28 CN CNB028136012A patent/CN1318956C/zh not_active Expired - Lifetime
- 2002-05-28 EP EP02737140A patent/EP1405172A4/en not_active Ceased
- 2002-05-28 WO PCT/US2002/016425 patent/WO2002097610A1/en active Application Filing
- 2002-05-28 JP JP2003500726A patent/JP2004534304A/ja active Pending
-
2005
- 2005-07-20 US US11/185,344 patent/US7752637B2/en active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6006279A (en) * | 1997-01-21 | 1999-12-21 | Canon Information Systems, Inc. | Plug-in module host framework |
US5893106A (en) * | 1997-07-11 | 1999-04-06 | International Business Machines Corporation | Object oriented server process framework with interdependent-object creation |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106060063A (zh) * | 2016-06-24 | 2016-10-26 | 武汉斗鱼网络科技有限公司 | 一种用于互联网网站前端逻辑入口的过滤方法及装置 |
CN106060063B (zh) * | 2016-06-24 | 2019-04-23 | 武汉斗鱼网络科技有限公司 | 一种用于互联网网站前端逻辑入口的过滤方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
EP1405172A4 (en) | 2004-12-22 |
JP2004534304A (ja) | 2004-11-11 |
AU2002310093A2 (en) | 2002-12-09 |
US6996832B2 (en) | 2006-02-07 |
CN1524216A (zh) | 2004-08-25 |
EP1405172A1 (en) | 2004-04-07 |
WO2002097610A1 (en) | 2002-12-05 |
US20050251809A1 (en) | 2005-11-10 |
US20030110312A1 (en) | 2003-06-12 |
US7752637B2 (en) | 2010-07-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1318956C (zh) | 软件构件插件程序结构的系统和方法 | |
US6484177B1 (en) | Data management interoperability methods for heterogeneous directory structures | |
US6308224B1 (en) | Method of generating an implementation of a workflow process model in an object environment | |
US7979842B2 (en) | Extensibility application programming interface and framework for meta-model objects | |
US7165075B2 (en) | Object graph faulting and trimming in an object-relational database system | |
US7191182B2 (en) | Containment hierarchy in a database system | |
US6654747B1 (en) | Modular scalable system for managing data in a heterogeneous environment with generic structure for control repository access transactions | |
JP2004280820A (ja) | ビジネスソフトウェアアプリケーションをサポートするフレームワーク | |
CN101421726A (zh) | 偶尔连接的应用服务器 | |
JP2004280821A (ja) | ソフトウェアビジネスプロセスモデル | |
CN1989489A (zh) | 在运行时系统中共享对象 | |
US6941309B2 (en) | Object integrated management system | |
US20060235867A1 (en) | Map and data location provider | |
US20030041069A1 (en) | System and method for managing bi-directional relationships between objects | |
US8707260B2 (en) | Resolving interdependencies between heterogeneous artifacts in a software system | |
US7376671B2 (en) | Method for common management model for distributed server network | |
US20030037313A1 (en) | System and method for class transitioning | |
US20030033442A1 (en) | Apparatus and method for providing a class versioning architecture | |
Mili et al. | View Programming: Towards a Framework for Decentralized Development and Execution of OO Programs | |
Mascolo et al. | CodeWeave: Exploring fine-grained mobility of code | |
WO2006028872A2 (en) | System and method for describing a relation ontology | |
Roantree | Engineering Federated Information Systems: Proceedings of the 3rd Workshop, EFIS 2000, June 19-20, 2000, Dublin (Ireland) | |
Atkinson et al. | Controlling view editability in projection-based modeling environments | |
AU2002310093B2 (en) | System and method for software component plug-in framework | |
Lassila | PORK Object System Programmer's Guide |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
ASS | Succession or assignment of patent right |
Owner name: ORACLE INT CORP Free format text: FORMER OWNER: BEA SYSTEMS CORP. Effective date: 20110418 |
|
C41 | Transfer of patent application or patent right or utility model | ||
TR01 | Transfer of patent right |
Effective date of registration: 20110418 Address after: California, USA Patentee after: Oracle Int Corp Address before: California, USA Patentee before: Bea Systems Corp. |
|
CX01 | Expiry of patent term |
Granted publication date: 20070530 |
|
CX01 | Expiry of patent term |