使用C++开发WPS Office插件教程

来源:岁月联盟 编辑:zhu 时间:2009-12-24
使用C++开发WPS Office插件教程内容简介:WPS Office的插件由一个实现了特定接口的DLL、一个XML配置文件以及插件本身需要的其他文件组成。WPS Office 插件DLL实际上是一个实现了_IDTExtensibility2接口的COM组件。 1. _IDTExtensibility2 插件DLL要导出COM要 Office的插件由一个实现了特定接口的DLL、一个XML配置文件以及插件本身需要的其他文件组成。WPS Office 插件DLL实际上是一个实现了_IDTExtensibility2接口的COM组件。
1. _IDTExtensibility2

插件DLL要导出COM要求的DllCanUnloadNow、DllGetClassObject、DllRegisterServer和DllUnregisterServer四个函数,并实现_IDTExtensibility2接口。_IDTExtensibility2接口的定义在Kingsoft Add-In Designer类型库中,导入ksaddndr.dll就可以使用这个接口。

#import "C:/Program Files/Kingsoft/WPS Office Personal/office6/ksaddndr.dll" named_guids, raw_interfaces_only



interface _IDTExtensibility2 : IDispatch
{
virtual HRESULT __stdcall OnConnection (
/*[in]*/ IDispatch * Application,
/*[in]*/ enum ext_ConnectMode ConnectMode,
/*[in]*/ IDispatch * AddInInst,
/*[in]*/ SAFEARRAY * * custom
) = 0;

virtual HRESULT __stdcall OnDisconnection (
/*[in]*/ enum ext_DisconnectMode RemoveMode,
/*[in]*/ SAFEARRAY * * custom
) = 0;

virtual HRESULT __stdcall OnAddInsUpdate (
/*[in]*/ SAFEARRAY * * custom
) = 0;

virtual HRESULT __stdcall OnStartupComplete (
/*[in]*/ SAFEARRAY * * custom
) = 0;

virtual HRESULT __stdcall OnBeginShutdown (
/*[in]*/ SAFEARRAY * * custom
) = 0;
};
插件安装时,WPS Office会将插件DLL注册(DllRegisterServer)到系统中。WPS Office启动时,将通过插件平台(管理插件的模块)加载插件。插件平台通过COM方式创建一个_IDTExtensibility2对象,然后调用_IDTExtensibility2.OnConnection。插件可以在OnConnection中做一些初始化操作,如添加菜单项、工具栏按钮等。OnConnection之后,OnStartupComplete将被调用,至此插件加载完成。WPS关闭时,插件平台先后调用OnBeginShutdown和OnDisconnection。目前,WPS Office插件平台不会调用插件的_IDTExtensibility2.OnAddInsUpdate方法。插件实现一个空的OnAddInsUpdate就可以了,即直接返回S_OK,应避免在其中编写其他代码,以免将来引起兼容问题。
1.1. _IDTExtensibility2.OnConnection
virtual HRESULT __stdcall OnConnection (
/*[in]*/ IDispatch * Application,
/*[in]*/ enum ext_ConnectMode ConnectMode,
/*[in]*/ IDispatch * AddInInst,
/*[in]*/ SAFEARRAY * * custom);
OnConnection方法一共带有4个参数。第一个参数Application是宿主程序对象;第二个参数是ext_ConnectMode类型的枚举值;第三个和第四个参数目前没有使用,插件实现OnConnection时必须忽略这两个参数。
ext_ConnectMode定义了4个常量值,如下所示。
enum ext_ConnectMode
{
ext_cm_AfterStartup = 0,
ext_cm_Startup = 1,
ext_cm_External = 2,
ext_cm_CommandLine = 3
};
其中,ext_cm_Startup和ext_cm_AfterStartup是插件平台加载COM插件时传入OnConnection的。ext_cm_External和ext_cm_CommandLine目前没有用到。
a. ext_cm_Startup
WPS启动时,插件平台会立即加载COM插件,调用OnConnection(Application, ext_cm_Startup)。
b. ext_cm_AfterStartup
用于安装插件过程。安装插件时,WPS Office插件平台会加载插件,并调用OnConnection(Application, ext_cm_AfterStartup),此时插件要做两件事情,即安装后的初始化以及加载初始化。如果插件安装以后不需要进一步的配置等初始化工作,那么对这个插件而言,不需要区分ext_cm_AfterStartup和ext_cm_Startup。
一般情况下,插件会在OnConnection中添加菜单项或者工具栏按钮等功能入口。在WPS Office添加的菜单项或者工具栏按钮,分为“临时”和“持久”两种类型。顾名思义,带有“临时”属性的菜单项或工具栏按钮,在WPS Office重新启动以后就不存在了;带有“持久”属性的菜单项或工具栏按钮,在WPS Office重新启动以后,仍然存在。
插件添加菜单项和工具栏按钮时,推荐使用“临时”的菜单项和工具栏按钮,在宿主程序关闭时,插件也不要调用API删除菜单或工具栏按钮。插件添加菜单项或工具栏按钮时,建议先检查这些菜单或按钮是否已经存在,以免重复添加。
1.2. _IDTExtensibility2.OnStartupComplete
插件平台加载插件过程中,会先后调用OnConnection和OnStartupComplete。如果插件需要在插件启动以后(OnConnection执行完之后)做一些事情,可以将这些工作放到OnStartupComplete中执行。大多数情况下,插件可以实现一个空的OnStartupComplete,返回S_OK即可。
1.3. _IDTExtensibility2.OnBeginShutdown
WPS Office关闭过程中,插件平台会调用OnBeginShutdown,通知插件做清理工作,如保存配置、终止未完成的工作、释放系统资源等。OnBeginShutdown在OnDisconnection之前被调用。
1.4. _IDTExtensibility2.OnDisconnection
OnDisconnection和OnConnection相对应,插件在OnConnection中添加菜单或工具栏命令、注册事件通知,OnDisconnection则注销事件通知。
virtual HRESULT __stdcall OnDisconnection (
/*[in]*/ enum ext_DisconnectMode RemoveMode,
/*[in]*/ SAFEARRAY * * custom) ;
OnDisconnection带RemoveMode和custom两个参数。其中custom参数目前没有用到,插件忽略这个参数即可;第一个参数RemoveMode是ext_DisconnectMode类型的枚举值,如下所示:
enum ext_DisconnectMode
{
ext_dm_HostShutdown = 0,
ext_dm_UserClosed = 1
};
目前只用到了ext_dm_HostShutdown。WPS Office关闭时,插件平台会调用插件的_IDTExtensibility2.OnDisconnection(ext_dm_HostShutdown, custum) 方法。前面推荐插件使用“临时”的菜单和工具栏按钮。使用“临时”菜单和按钮时,插件在处理ext_dm_HostShutdown过程中不需要删除菜单、按钮等项目。

2.
插件配置文件

WPS Office插件的配置文件是一个符合一定命名规则的XML文件。插件配置文件必须和插件DLL放在相同的文件夹中。
插件配置文件的文件名必须遵循“[addon-name].[app-name].[lang].xml”这样的格式。
a. [addon-name]
插件模块的名称,必须和插件模块的文件名完全一致。如WpsAddonDemo.dll插件,[addon-name]为“WpsAddonDemo”。
b. [app-name]
插件支持的WPS模块,包括:wps、et、wpp、kso,其中kso表示支持WPS Office的所有模块。
c. [lang]
插件支持的语言版本,如1033、2052等。“0”表示支持所有语言。
假如WpsAddonDemo.dll插件支持WPS Office的所有模块,支持简体中文,那么它的配置文件名称为“WpsAddonDemo.kso.2052.xml”。
如果插件需要针对WPS Office的不同模块编写不同的配置文件,那么可以按照以上规则编写多个配置文件。插件平台优先使用精确匹配的插件配置文件,以WpsAddonDemo插件为例,WPS文字启动时,插件平台先查找名为“WpsAddonDemo.wps.2052.xml”的配置文件,若找不到则继续查找名为“WpsAddonDemo.kso.2052.xml”的配置文件,如果都找不到,则说明该插件不支持WPS文字。

<ksoplugin version="1">




id="{70D748C8-974D-44C0-8115-9072478A6009}"


version="1.0.0.1234"


type="comaddin"


name="插件示例"


author="WPS"


desc="WPS Office 插件简介"


image="icon.jpg"


homepage="http://www.wps.cn/addons"


help="http://bbs.wps.cn"


loadimm="1"


updateitv="7" />
ksoplugin
>

使用C++开发WPS Office插件教程【图】_

图(1) 插件属性示例


插件配置文件中至少要包含id、version、type、name四项数据。
a. id
插件id是插件COM组件的CLSID,WPS Office插件平台将根据id加载插件,获取_IDTExtensibility2接口。
b. verion
插件版本号使用Windows风格的命名方式,即[主版本号][子版本号][修正版本号][构建],如“1.1.0.29”。插件版本号会显示在插件平台对话框中。
c. type
type必须为comaddin,说明插件DLL是一个COM组件。
d. name
在插件平台对话框中看到的插件名称。
e. loadimm
WPS启动时是否立即加载插件,必须为“1”,表示立即加载插件。