admin 管理员组

文章数量: 1184232


2024年4月19日发(作者:jquery3)

如何使用C++开发WPS插件

如何使用C++开发WPS Office插件

WPS Office的插件由一个实现了特定接口的DLL、一个XML配置文件以及插件本身需要的其他文件

组成。WPS Office 插件DLL实际上是一个实现了

_IDTExtensibility2接口的

COM组件。

1.

_IDTExtensibility2

插件DLL要导出COM要求的DllCanUnloadNow、DllGetClassObject、DllRegisterServer

和DllUnregisterServer四个函数,并实现_IDTExtensibility2接口。_IDTExtensibility2接口的

定义在Kingsoft Add-In Designer类型库中,导入就可以使用这个接口。

#import "C:Program FilesKingsoftWPS Office "

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对象,然后调用_ection。插件可以在

1

如何使用C++开发WPS插件

OnConnection中做一些初始化操作,如添加菜单项、工具栏按钮等。OnConnection之后,

OnStartupComplete将被调用,至此插件加载完成。WPS关闭时,插件平台先后调用

OnBeginShutdown和OnDisconnection。目前,WPS Office插件平台不会调用插件的

_nsUpdate方法。插件实现一个空的OnAddInsUpdate就可以了,即

直接返回S_OK,应避免在其中编写其他代码,以免将来引起兼容问题。

1.1.

_ection

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.

_tupComplete

插件平台加载插件过程中,会先后调用OnConnection和OnStartupComplete。如果插件

2

如何使用C++开发WPS插件

需要在插件启动以后(OnConnection执行完之后)做一些事情,可以将这些工作放到

OnStartupComplete中执行。大多数情况下,插件可以实现一个空的OnStartupComplete,返

回S_OK即可。

1.3.

_nShutdown

WPS Office关闭过程中,插件平台会调用OnBeginShutdown,通知插件做清理工作,如

保存配置、终止未完成的工作、释放系统资源等。OnBeginShutdown在OnDisconnection之

前被调用。

1.4.

_onnection

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关闭时,插件平台会调用插件的

_onnection(ext_dm_HostShutdown, custum) 方法。前面推荐插件使用

“临时”的菜单和工具栏按钮。使用“临时”菜单和按钮时,插件在处理ext_dm_HostShutdown

过程中不需要删除菜单、按钮等项目。

2. 插件配置文件

WPS Office插件的配置文件是一个符合一定命名规则的XML文件。插件配置文件必须

和插件DLL放在相同的文件夹中。

插件配置文件的文件名必须遵循“[addon-name].[app-name].[lang].xml”这样的格式。

a. [addon-name]

插件模块的名称,必须和插件模块的文件名完全一致。如插件,

[addon-name]为“WpsAddonDemo”。

b. [app-name]

插件支持的WPS模块,包括:wps、et、wpp、kso,其中kso表示支持WPS Office

的所有模块。

c. [lang]

插件支持的语言版本,如1033、2052等。“0”表示支持所有语言。

假如插件支持WPS Office的所有模块,支持简体中文,那么它的

3

如何使用C++开发WPS插件

配置文件名称为“”。

如果插件需要针对WPS Office的不同模块编写不同的配置文件,那么可以按照以上规

则编写多个配置文件。插件平台优先使用精确匹配的插件配置文件,以WpsAddonDemo插

件为例,WPS文字启动时,插件平台先查找名为“”的配置

文件,若找不到则继续查找名为“”的配置文件,如果都找不

到,则说明该插件不支持WPS文字。

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

version="1.0.0.1234"

type="comaddin"

name="插件示例"

author="WPS"

desc="WPS Office 插件简介"

image=""

homepage="/addons"

help=""

loadimm="1"

updateitv="7" />

4

图(1) 插件属性示例

如何使用C++开发WPS插件

插件配置文件中至少要包含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”,表示立即加载插件。

5


本文标签: 插件 平台 按钮 工具栏