Word的COM加载项开发指南
所谓程序插件(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加载项开发指南相关推荐
- WPS 加载项开发说明
WPS 加载项结构 WPS 加载项由 自定义功能区和网页两部分组成.自定义功能区只需要一个配置文件,对应 WPS 加载项目录中的ribbon.xml文件: 网页部分负责执行自定义功能区对应的逻辑功能. ...
- Microsoft Office Word 2003稿纸加载项 无法卸载解决方法
今天在新电脑上安装Office,先搞了2003版本,发现文档图标异常,于是找了其他Office版本.结果卸载2003时发现,有个"Microsoft Office Word 2003稿纸加载 ...
- 有道词典在word中的加载项导致word使用acobat转化PDF时出现word停止工作
一直很奇怪为什么word转PDF怎么一直搞得word生活不能自理,搞了好久都没找到解决办法原来罪魁祸首是有道德在word中的加载项导致的,最好的解决办法就是不让有道德加载项启动. 首先点word的文件 ...
- Word中Endnote加载项不见处理办法
打开word-①文件-②选项-③加载项,查看是否禁用了EndNote cite while you write选项. 如果禁用,将在下方"禁用的应用程序加载项"处出现,否则执行以下 ...
- wps加载项开发和使用
这里写自定义目录标题 wps加载项的使用 准备环境 生成一个加载项的demo wps加载项的使用 准备环境 1.安装wps企业版(个人版可能出问题) 2.安装node 环境 3.详细情况可查看官方开发 ...
- Microsoft Office Word 2003 稿纸加载项卸载不了 怎么处理
windows键---运行---输入regedit打开注册表,找到"HKEY_CURRENT_USER\Software\Microsoft\Installer\Products" ...
- vsto与word基础介绍-新建第一个word加载项〔1〕
系列文章目录 专栏目录:专栏目录 上节链接:word加载项 vsto从入门到精通–专栏目录 vs2019社区版:VS2019社区版免费下载 转载或转发请注明出处,有问题请私聊博主! 文章目录 系列文章 ...
- [Mac版]安装Zotero之后打开word没有相应的加载项解决方案
安装完Zotero后,如何在Word中添加加载项,使得其可以添加文献呢? 关于常规步骤,社区内的这篇文章已经讲的很清楚了:Word中没有Zotero加载项(超有用) 但是有时候,即使完成了上述步骤,W ...
- 在Word 2007中启用或禁用Office加载项
Office加载项是Office程序为了完成某种功能而需要在启动程序时自动加载的模块,例如书法字帖功能.稿纸功能.制作信封功能等.用户可以根据工作需要启用或禁用Office加载项,以提高Office程 ...
最新文章
- nlp文本数据增强_如何使用Texthero为您的NLP项目准备基于文本的数据集
- 以假乱真的“人造脸”,能骗过面部识别吗?
- 前端模块化,AMD与CMD的区别
- java用继承编写宠物乐园_MoreThanJavaDay 5:面向对象进阶继承详解
- 用户中心 - 查询用户信息
- 为你总结了N个真实线上故障,从容应对面试官!
- Mysql常用命令(二)
- python各版本区别_关于python中不同版本的print区别
- datagrid wpf 获取选中_c# WPF DataGrid 获取选中单元格信息
- 一款纯HTML二次元响应式引导页
- AcWing321.棋盘分割(区间DP)题解
- unity, destroy gameObject destroy all children
- 一个基于DataTable的后台框架的实现
- FINEMVC重定向和显示合计
- nlp基础—12.LSTM-CRF模型介绍
- 微信群发工具,纯Python编写~
- linux修复win10启动失败,win10自动修复失败开不了机解决方法
- 【机器学习课程】第一章机器学习概述 2.机器学习
- Armbian (jammy) 上安装 Docker
- Generative Adversarial Networks in Computer Vision: A Survey and Taxonomy(计算机视觉中的GANs:综述与分类)