二次开发接口(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)相关推荐

  1. 通达信二次开发接口api如何操作?

    通达信二次开发接口api如何操作,步骤如下: 1.调用LoadLibrary加载MetaTrade.dll实例: 2.调用GetProcAddress获取API函数地址: 3.调用Init接口进行AP ...

  2. TESS NG微观交通仿真软件二次开发接口如何规划

    TESS NG的二次开发接口正在设计当中,很想得到广大同仁的意见.目前的想法是二次开发接口分成三类,一类是基本接口,第二类是定制开发接口,第三类是项目专有接口. 定制开发接口在基本开发接口的基础上增加 ...

  3. 国产微观交通仿真软件TESS NG V2.1 Python二次开发接口版本发布

    来源:上海济达交通科技有限公司 上海济达交通科技有限公司是国产TESS NG微观交通软件研发商.2022年9月26日,上海济达交通科技有限公司正式发布了TESS NG的V2.1 Python二次开发接 ...

  4. EasyDSS流媒体服务器软件-搭建及二次开发接口对接说明示列

    EasyDSS流媒体服务器软件,提供一站式的转码.点播.直播.时移回放服务,极大地简化了开发和集成的工作. 其中,点播功能主要包含:上传.转码.分发.直播功能主要包含:直播.录像, 直播支持RTMP输 ...

  5. 解决WPS及office二次开发接口无法注册的问题

    问题描述 使用QAxObject的setControl注册接口时返回失败的解决方法 二次开发接口名称 WPS文字 KWPS.Aplication WPS的Excel KET.Application W ...

  6. LED显示屏二次开发接口的设计方案

    引言 在LED 显示屏工程应用中,有单块显示屏项目,但更多的是多块显示屏项目.对于单块显示屏,直接使用厂商配置的控制软件就满足要求了:但对于多块显示屏,尤其是系统集成项目,厂商配置的控制软件就很难满足 ...

  7. ENVI_IDL:批量重投影ModisSwath产品(调用二次开发接口)+解析

    目录 1. 课堂内容 1. 获取Modis Swath数据(这里只获取Lat.Lon.Aod(气溶胶厚度)三个数据集以及aod数据集的两个属性),并对aod数据进行简单的处理 2. 调用二次开发接口以 ...

  8. python调用linuxapi_Linux上使用python调用WPS二次开发接口

    原文链接Linux上使用python调用WPS二次开发接口 - C++ Programer​www.cryfeifei.cn 环境Ubuntu18.04 WPS For Linux Python3 简 ...

  9. 你好五一、你好TESS NG python二次开发接口

    今天是五一劳动节,国产微观交通仿真软件TESS NG的python开发接口内测版今天发布.         4月1日到今天5月1日一个月时间,疫情将我"封"在出租里,我将TESS ...

最新文章

  1. 代码即财富之我学Java对象序列化与反序列化(2)
  2. hereim_美句_1
  3. 最后一期:如何更新LSTM模型?(附代码)| 博士带你学LSTM
  4. java 事件分发线程_Java事件调度线程说明
  5. 一个奇怪的sql异常
  6. 基于语言文件的asp.net全球化解决方案
  7. python和C语言分别实现插入排序
  8. 赶紧收藏!非常实用的 30 个 Python 技巧
  9. maven GroupId 和ArtifactId通常填什么
  10. php 改变图片的宽高,php缩放图片(根据宽高的等比例缩放)示例
  11. proDAD Adobe pr cc2020 会声会影视频转场特效制作软件,滤镜特效插件
  12. 解码h264和h265需要的cpu性能
  13. 3大领域,4大方向,做好数据分析岗位的职业规划
  14. html怎么使两张照片重叠,怎样把两张图片叠加在一起?
  15. 2020快手前端暑期实习面经
  16. Libevent教程001: 简介与配置
  17. 由kobject_create_and_add全面了解kobject
  18. 更加简便的使用VSS
  19. 数据库建表-- 一对多/多对一/一对一/多对多 关系
  20. ATW热泵市场现状及未来发展趋势分析

热门文章

  1. 22调剂|兰州理工大学MBA/MIB预调剂申请通知-文都管联院
  2. Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示
  3. 药店app的布局html,药店详情页.html
  4. OCR(Optical Character Recognition 光学字符识别)扫盲
  5. H3CNE认证网络工程师视频课程-宋文峰-专题视频课程
  6. MySQL数据库 --- 高级篇
  7. 「老文补发」写在GitBubble上线之后
  8. Windows装机必备软件大全,全部支持win7、Vista系统
  9. 安卓笔记-第一行代码版(看书慢,故不打算再抠书,但笔记是心血)
  10. MapStruct - Couldn‘t retrieve @Mapper annotation