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

本文主要是介绍自动化(Automation)基础概念:二次开发接口(API)与插件(Addin),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

  • 自动化(Automation)基础概念:COM组件(Component)与接口(Interface) 
  • 自动化(Automation)基础概念:变体(Variant)与Dispatch调用(IDispatch)

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

  • 自动化(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无缝地结合在一起,从而使得整个系统可以滚雪球一样越滚越大。

 


这篇关于自动化(Automation)基础概念:二次开发接口(API)与插件(Addin)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/618072

相关文章

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

零基础STM32单片机编程入门(一)初识STM32单片机

文章目录 一.概要二.单片机型号命名规则三.STM32F103系统架构四.STM32F103C8T6单片机启动流程五.STM32F103C8T6单片机主要外设资源六.编程过程中芯片数据手册的作用1.单片机外设资源情况2.STM32单片机内部框图3.STM32单片机管脚图4.STM32单片机每个管脚可配功能5.单片机功耗数据6.FALSH编程时间,擦写次数7.I/O高低电平电压表格8.外设接口

ps基础入门

1.基础      1.1新建文件      1.2创建指定形状      1.4移动工具          1.41移动画布中的任意元素          1.42移动画布          1.43修改画布大小          1.44修改图像大小      1.5框选工具      1.6矩形工具      1.7图层          1.71图层颜色修改          1

通过高德api查询所有店铺地址信息

通过高德api查询所有店铺地址电话信息 需求:通过高德api查询所有店铺地址信息需求分析具体实现1、申请高德appkey2、下载types city 字典值3、具体代码调用 需求:通过高德api查询所有店铺地址信息 需求分析 查询现有高德api发现现有接口关键字搜索API服务地址: https://developer.amap.com/api/webservice/gui

DDei在线设计器-API-DDeiSheet

DDeiSheet   DDeiSheet是代表一个页签,一个页签含有一个DDeiStage用于显示图形。   DDeiSheet实例包含了一个页签的所有数据,在获取后可以通过它访问其他内容。DDeiFile中的sheets属性记录了当前文件的页签列表。   一个DDeiFile实例至少包含一个DDeiSheet实例。   本篇最后提供的示例可以在DDei文档直接预览 属性 属性名说明数

API-环境对象

学习目标: 掌握环境对象 学习内容: 环境对象作用 环境对象: 指的是函数内部特殊的变量this,它代表着当前函数运行时所处的环境。 作用: 弄清楚this的指向,可以让我们代码更简洁。 函数的调用方式不同,this指代的对象也不同。【谁调用,this就是谁】是判断this指向的粗略规则。直接调用函数,其实相当于是window.函数,所以this指代window。

vue3项目将所有访问后端springboot的接口统一管理带跨域

vue3项目将所有访问后端springboot的接口统一管理带跨域 一、前言1.安装Axios2.创建Axios实例3.创建API服务文件4.在组件中使用API服务 二、跨域三、总结 一、前言 在Vue 3项目中,统一管理所有访问后端Spring Boot接口的最佳实践是创建一个专门的API服务层。这可以让你的代码更加模块化、可维护和集中管理。你可以使用Axios库作为HTT

[FPGA][基础模块]跨时钟域传播脉冲信号

clk_a 周期为10ns clk_b 周期为34ns 代码: module pulse(input clk_a,input clk_b,input signal_a,output reg signal_b);reg [4:0] signal_a_widen_maker = 0;reg signal_a_widen;always @(posedge clk_a)if(signal_a)

00 - React 基础

1. React 基础 安装react指令 可参考: 官网官网使用教程 如: npx create-react-app 项目名如:npx create-react-app react-redux-pro JSX JSX 是一种 JavaScript 的语法扩展,类似于 XML 或 HTML,允许我们在 JavaScript 代码中编写 HTML。 const element =