自动化(Automation)基础概念:二次开发接口(API)与插件(Addin)

二次开发接口(API)与插件(Addin)

许式伟 (版权声明)
2007-4-20

在前文,我们已经解释了:

而同时,我们经常也可能经常听到以下这些词语:

  • 自动化(Automation,COM Automation)
  • OA(办公自动化,Office Automation)
  • 二次开发接口(应用程序开发接口,Application Programming Interface,API)
  • 插件(Addin,Addon)

等等。本文试图解释这些概念。

自动化(Automation)顾名思义是指“让机器在没有人工干预的情况下自动完成特定的任务”。为了完成这一目标,自动化(Automation)技术的核心想法是,应用程序(Application)需要把自己的核心功能以DOM模型的形式对外提供,使得别人能够通过这个DOM模型来使用该应用程序的功能。这也就是我们通常说的应用程序编程接口——Application Programming Interface,简称API。为了与Windows API这样的编程接口区分开来,我们引入一个专有名词,叫“二次开发接口”。“二次开发”取意于“在现有应用程序基础上进行再开发”。其实如果你愿意把操作系统当作一个更大的应用程序的话,二次开发接口和Windows API并没有什么很大的本质上的差异(尽管我们知道Windows API并不是以COM组件方式提供的)。

理解了自动化(Automation),OA(办公自动化,Office Automation)就比较好解释,无非是应用程序特指办公软件而已。而OA是指办公(包括公文流转)系统的自动化。

在应用程序提供了编程接口(API)的前提下,典型情况下,我们有两种办法来使用这些API。方法一是把应用程序当作一个Server,通过API对外提供服务。在此情形下,应用程序只是作为一个EXE COM Server的服务程序而已。只要我们理解进程间的LPC或者RPC调用是怎么回事,那么一切就非常Easy。方法二是实现一个应用程序插件(Addin)。这种方法更有意思一些。首先,这是一种进程内的调用,效率非常好。其次,这是一种双向的通讯,应用程序通过它提供的插件机制感知到插件的存在,并且将插件加载上来;插件则是在获得活动权后,通过应用程序的API完成特定的功能。最后,也是最重要的,插件与应用程序融为一体,实际上是扩展了应用程序的能力,使得应用程序变得更为强大。

插件(Addins)的启动过程大体如下:

  1. 应用程序启动。通过注册表(或者存放于其他任何地方)获得插件列表。插件一般以 COM 组件形式提供,故此只要有一个插件的 CLSID 或者 ProgID 的列表就可以了。另外,插件的功能可以千差万别,但是他们需要统一实现一个接口,例如 _IDTExtensibility2 或者类似的东西。这个接口在下面的第二步就用到了。
  2. 遍历插件列表,创建并初始化各插件。关键是初始化。当然应用程序并不知道插件想做什么,它只是取得 _IDTExtensibility2(或者类似接口),调用其中的初始化函数(如 OnConnection)。
  3. 插件获得了初始化机会。注意,在初始化的时候,应用程序把自己的DOM模型的根接口(我们通常称为Application)传入。在 _IDTExtensibility2 中,根接口被定义为 IDispatch 类型,即 IDispatch* Application。但是实际上可以更通用,如IUnknown* Application。有了这个 Application 指针,插件就可以为所欲为,做它想做的事情,调用它想要调用的任何API。

从插件(Addins)展开来讲,可以讲非常多的内容。然而这不是本文的意图。所以关于这方面的内容,我们只能留待以后有机会继续这个话题。不过我还是忍不住把话题起个开头:由于插件(Addin)机制使得应用程序结构显得更为灵活,所以,越来越多的软件架构,追求一种超轻量的内核(也就是我们说的应用程序,之所以称为内核,是因为它是组织一切的核心),并把更多的功能通过插件(Addin)方式提供。超轻量的内核意味着需要解决一个额外的关键点:就是插件(Addin)不只是扩展应用程序的功能,也同时扩展了应用程序的API,这些API与原有内核的API无缝地结合在一起,从而使得整个系统可以滚雪球一样越滚越大。

你可能感兴趣的:(编程,windows,活动,Office)