打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Word的COM加载项开发指南

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

之前介绍的基于Word客户端的电子印章系统,就是典型的程序插件,它被加载到Word的进程,在Word的编辑环境中加入了自己的菜单,并实现了针对Word文档的签章、验证等功能。

今天介绍一下它的实现过程,希望对大家以后做类似功能的开发有所帮助。

实现接口

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

首先需引用此类型库。如果使用VC开发,可以通过实现接口向导引用,如下图。

注意,通过向导添加后,在stdafx.h里的输入语句是开发机器上MSADDNDR.DLL的绝对路径,比如:

#import "C:\Program Files (x86)\CommonFiles\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定义了五个接口函数用于插件与主程序的通信,其说明如下表:

接口名称

说明

OnAddInsUpdate(Array)

当插件加载或退出时被主程序调用。参数Array为主程序传递给插件的数据,默认为空数组,下同。

OnBeginShutdown(Array)

当主程序结束时被主程序调用。

OnConnection(Object, ext_ConnectMode, Object, Array)

当插件加载时被主程序调用。参数中第一个Object为主程序对象,ext_ConnectMode为插件加载方式,第二个Object为插件对象。

OnDisconnection(ext_DisconnectMode, Array)

当插件退出时被主程序调用。参数ext_DisconnectMode为插件退出方式。

OnStartupComplete(Array)

当插件加载完成时被主程序调用

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

注册插件

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

如果插件是对当前用户有效就用前者,如果对所有用户生效就用后者。如果是64位系统中安装的32Word,那注册表路径相应改为HKEY_CURRENT_USER\Software\Wow6432Node\Microsoft\Office\Word\AddInsHKEY_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中使用了。我们可以在WordCOM加载项窗口中管理这些插件,如下图。

ExcelWPS也采用类似的插件注册方式。其中,高版本的WPS文字甚至可以直接使用Word的插件注册信息,作为其自身的插件。大家可以自行研究。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
WPS插件的实现和发布
用VC6.0编写Word插件(Office2K、XP、03) - C/C++/VC/MFC...
HOWTO:使用VisualC#.NET生成OfficeCOM外接程序
用VB创建MS Office的COM加载项
OFFICE 的加载项(add in)(转)
Office 没有加载项的解决方法
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服