所谓程序插件(add-in),是指根据主程序的SDK制作出的程序模块。这个模块必须做到以下两点:实现主程序SDK定义的某种接口(不一定是COM接口);必须以某种形式注册,如写入特定注册表信息或者存放在主程序规定的特定路径下。实现上述两点后,主程序运行时,就会根据注册方式找到插件模块,并根据实现的接口加载它。这样,程序插件就插入到主程序的运行进程中,并可以实现自己的功能了。

之前介绍的基于Word客户端的电子印章系统,就是典型的程序插件,它被加载到Word的进程,在Word的编辑环境中加入了自己的菜单,并实现了针对Word文档的签章、验证等功能。
今天介绍一下它的实现过程,希望对大家以后做类似功能的开发有所帮助。

实现接口

因为Word程序插件是COM控件,所以在Word里把这种插件叫COM加载项。它需要实现类型库Microsoft Add-in Designer的接口IDTExtensibility2,这个类型库对应的文件是MSADDNDR.DLL,它默认的位置在:程序安装路径\Common Files\DESIGNER目录里,安装了微软的Office就会有此文件(其实IDTExtensibility2接口最开始是用于Visual Studio IDE工具的拓展开发的)。

首先需引用此类型库。如果使用VC开发,可以通过实现接口向导引用,如下图。
注意,通过向导添加后,在stdafx.h里的输入语句是开发机器上MSADDNDR.DLL的绝对路径,比如:

#import “C:\Program Files (x86)\Common Files\DESIGNER\MSADDNDR.DLL” raw_interfaces_only, raw_native_types, no_namespace, named_guids, auto_search

因此,需要将#import 的内容改为使用类型库ID,如下:

#import “libid:AC0714F2-3D04-11D1-AE7D-00A0C90F26F4” raw_interfaces_only, raw_native_types, no_namespace, named_guids, auto_search

类型库ID可以通过在IDTExtensibility2接口上点击右键去到其定义MSADDNDR.tlh里查找。

当然,你也可以手工地在stdafx.h里加入上述语句,并在插件类的声明里加上如下实现接口声明:

public IDispatchImpl<_IDTExtensibility2, &__uuidof(_IDTExtensibility2), &LIBID_AddInDesignerObjects, /* wMajor = */ 1>.

如果是使用VB开发,直接添加引用即可。
接下来就是实现接口了, IDTExtensibility2定义了五个接口函数用于插件与主程序的通信,其说明如下表:
上述接口函数中,最重要的就是OnConnection和OnStartupComplete.在OnConnection的实现代码中,插件可以通过Object参数获得主程序对象,由此就可以访问主程序并调用其各种属性、方法。在OnStartupComplete中,因为此时已加载完毕,插件可以实现各种预定的功能了。其他接口可用于一些变量的初始化和内存释放工作,如果确实无事可做,直接返回即可。因此,我们可以在实现OnConnection接口的方法里获得Word程序对象,在实现OnStartupComplete接口的方法里访问、操作这个对象,从而实现插件的功能。至于Word程序对象有哪些属性方法等接口可以调用,就属于Word二次开发的内容了,本文不再展开。

注册插件

Word采用记录注册表方式注册插件,注册表位置如下:HKEY_CURRENT_USER\Software\Microsoft\Office\Word\AddIns或HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\Word\Addins.

如果插件是对当前用户有效就用前者,如果对所有用户生效就用后者。如果是64位系统中安装的32位Word,那注册表路径相应改为HKEY_CURRENT_USER\Software\Wow6432Node \Microsoft\Office\Word\AddIns或HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node \Microsoft\Office\Word\Addins.

在上述注册表位置下,每一个插件为一个子项,插件类的ProgID为子项的名称,如下图:
其中,“WordClient7.WordAddin”是插件的控件类名,常用的有以下几个键值

Description:插件的简短描述。

FriendlyName:是在“COM加载项”对话框中显示的插件名称。

LoadBehavior:插件的加载方式,它由以下几个值组合而成: 0表示不加载、1表示加载、2表示程序启动时采取动作、8表示需要时采取动作、16表示首次连接时采取动作。所以一般设置为3,表示Word启动时加载。

CommandLineSafe:标识插件是不是命令行安全的,一般设置成0.

按照上述方式设置注册表值后,插件就可以集成在Word中使用了。我们可以在Word的COM加载项窗口中管理这些插件,如下图。
Excel、WPS也采用类似的插件注册方式。其中,高版本的WPS文字甚至可以直接使用Word的插件注册信息,作为其自身的插件。大家可以自行研究。

Word的COM加载项开发指南相关推荐

  1. WPS 加载项开发说明

    WPS 加载项结构 WPS 加载项由 自定义功能区和网页两部分组成.自定义功能区只需要一个配置文件,对应 WPS 加载项目录中的ribbon.xml文件: 网页部分负责执行自定义功能区对应的逻辑功能. ...

  2. Microsoft Office Word 2003稿纸加载项 无法卸载解决方法

    今天在新电脑上安装Office,先搞了2003版本,发现文档图标异常,于是找了其他Office版本.结果卸载2003时发现,有个"Microsoft Office Word 2003稿纸加载 ...

  3. 有道词典在word中的加载项导致word使用acobat转化PDF时出现word停止工作

    一直很奇怪为什么word转PDF怎么一直搞得word生活不能自理,搞了好久都没找到解决办法原来罪魁祸首是有道德在word中的加载项导致的,最好的解决办法就是不让有道德加载项启动. 首先点word的文件 ...

  4. Word中Endnote加载项不见处理办法

    打开word-①文件-②选项-③加载项,查看是否禁用了EndNote cite while you write选项. 如果禁用,将在下方"禁用的应用程序加载项"处出现,否则执行以下 ...

  5. wps加载项开发和使用

    这里写自定义目录标题 wps加载项的使用 准备环境 生成一个加载项的demo wps加载项的使用 准备环境 1.安装wps企业版(个人版可能出问题) 2.安装node 环境 3.详细情况可查看官方开发 ...

  6. Microsoft Office Word 2003 稿纸加载项卸载不了 怎么处理

    windows键---运行---输入regedit打开注册表,找到"HKEY_CURRENT_USER\Software\Microsoft\Installer\Products" ...

  7. vsto与word基础介绍-新建第一个word加载项〔1〕

    系列文章目录 专栏目录:专栏目录 上节链接:word加载项 vsto从入门到精通–专栏目录 vs2019社区版:VS2019社区版免费下载 转载或转发请注明出处,有问题请私聊博主! 文章目录 系列文章 ...

  8. [Mac版]安装Zotero之后打开word没有相应的加载项解决方案

    安装完Zotero后,如何在Word中添加加载项,使得其可以添加文献呢? 关于常规步骤,社区内的这篇文章已经讲的很清楚了:Word中没有Zotero加载项(超有用) 但是有时候,即使完成了上述步骤,W ...

  9. 在Word 2007中启用或禁用Office加载项

    Office加载项是Office程序为了完成某种功能而需要在启动程序时自动加载的模块,例如书法字帖功能.稿纸功能.制作信封功能等.用户可以根据工作需要启用或禁用Office加载项,以提高Office程 ...

最新文章

  1. nlp文本数据增强_如何使用Texthero为您的NLP项目准备基于文本的数据集
  2. 以假乱真的“人造脸”,能骗过面部识别吗?
  3. 前端模块化,AMD与CMD的区别
  4. java用继承编写宠物乐园_MoreThanJavaDay 5:面向对象进阶继承详解
  5. 用户中心 - 查询用户信息
  6. 为你总结了N个真实线上故障,从容应对面试官!
  7. Mysql常用命令(二)
  8. python各版本区别_关于python中不同版本的print区别
  9. datagrid wpf 获取选中_c# WPF DataGrid 获取选中单元格信息
  10. 一款纯HTML二次元响应式引导页
  11. AcWing321.棋盘分割(区间DP)题解
  12. unity, destroy gameObject destroy all children
  13. 一个基于DataTable的后台框架的实现
  14. FINEMVC重定向和显示合计
  15. nlp基础—12.LSTM-CRF模型介绍
  16. 微信群发工具,纯Python编写~
  17. linux修复win10启动失败,win10自动修复失败开不了机解决方法
  18. 【机器学习课程】第一章机器学习概述 2.机器学习
  19. Armbian (jammy) 上安装 Docker
  20. Generative Adversarial Networks in Computer Vision: A Survey and Taxonomy(计算机视觉中的GANs:综述与分类)

热门文章

  1. 政府网站群建设的核心内容
  2. 生产力 生产关系 生产工具_我的9个最喜欢的生产力工具
  3. 今天告诉你音频剪切的方法有哪些
  4. ios5解决Cydia 点击搜索闪退方法
  5. VisionPro 定位添加瞄准效果
  6. Robtinum之instrumention
  7. 珞珈一号01星(兰州)
  8. 鸿蒙 保存图片到相册
  9. 基于ARM开发板的简单串口服务器
  10. php E58论坛有哪些比拟不错的论坛源代码的网站