用Delphi开发Wps Office 插件一二.docx
- 文档编号:8702688
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:19
- 大小:206.49KB
用Delphi开发Wps Office 插件一二.docx
《用Delphi开发Wps Office 插件一二.docx》由会员分享,可在线阅读,更多相关《用Delphi开发Wps Office 插件一二.docx(19页珍藏版)》请在冰豆网上搜索。
用Delphi开发WpsOffice插件一二
用Delphi开发WpsOffice插件
(一)
一、开发前的准备工作
本文的开发环境是基于delphi7.0和WPSOFFICE2009个人版。
开发前要先做好以下准备工作。
先导入相关的COM库。
打开delphi,点击菜单"Project"---"ImportTypeLibrary...",在弹出的对话框中选择相应的类型库(如下图)。
以上五个类型库都要导入,由于每次只能导入一个,所以要分五次导入。
“KingsoftAdd-InDesigner”是Add-In插件COM接口对象。
“KingsoftOffice1.0ObjectLibrary”是WpsOffice公用对象库COM接口。
“KingsoftWPS2.0ObjectLibrary”是WPS文字的COM接口。
“KingsoftET2.0ObjectLibrary”是WPS表格的COM接口。
“KingsoftWPP2.0ObjectLibrary”是WPS演示的COM接口。
二、创建插件框架
创建插件COM对象
WPSOffice的插件由一个实现了特定接口的DLL、一个XML配置文件以及插件本身需要的其他文件组成。
WPSOffice插件DLL实际上是一个实现了_IDTExtensibility2接口的COM组件,这个接口就在我们刚才导入的“KingsoftAdd-InDesigner”对象中。
我们只用创建一个COM对象来实现这个接口,就可以继续我们的开发了。
打开delphi7.0,新建一个“ActiveXLibrary”,保存为“SimpleLib.dpr”。
再新建一个“AutomationObject”,CoClassName输入我们要创建的类名“SimpleAddin”,然后点击OK按钮。
把弹出的类型库编辑器关闭,将unit1保存为“untSimple.pas”,此时单元代码如下:
unituntSimple;
{$WARNSYMBOL_PLATFORMOFF}
interface
uses
ComObj,ActiveX,SimpleLib_TLB,StdVcl;
type
TSimpleAddin=class(TAutoObject,ISimpleAddin)
protected
end;
implementation
usesComServ;
initialization
TAutoObjectFactory.Create(ComServer,TSimpleAddin,Class_SimpleAddin,ciMultiInstance,tmApartment);
end.
这是我们创建的com对象源码,它目前还没有实现相关的接口。
下面我们要添加要使用的单元和要实现我接口。
将光标定位到uses区段,在后面添加三个单元的引用,分别是“AddInDesignerObjects_TLB”、“KSO_TLB”、“WPS_TLB”,然后添加接口的实现。
TSimpleAddin=class(TAutoObject,ISimpleAddin,_IDTExtensibility,ICommandBarButtonEvents)
protected
{实现_IDTExtensibility2}
procedureOnAddInsUpdate(varcustom:
PSafeArray);safecall;
procedureOnBeginShutdown(varcustom:
PSafeArray);safecall;
procedureOnConnection(constapp:
IDispatch;
ConnectMode:
ext_ConnectMode;constAddInInst:
IDispatch;
varcustom:
PSafeArray);safecall;
procedureOnDisconnection(RemoveMode:
ext_DisconnectMode;
varcustom:
PSafeArray);safecall;
procedureOnStartupComplete(varcustom:
PSafeArray);safecall;
{实现ICommandBarButtonEvents}
procedureClick(constCtrl:
CommandBarButton;
varCancelDefault:
WordBool);stdcall;
end;
由于我们要响应工具栏按钮的单击事件,所以同时添加了ICommandBarButtonEvents
接口的实现。
现在应该说一个插件的框架已经完成了,具体实现怎样的功能,就看我们自己的实现了。
3、实现我们的功能
由于是一个示例插件,所以我们要实现的功能很简单,就是在标准工具栏上添加两个按钮,点击不同的按钮弹出不同的信息。
在具体实现之前,我们先了解一下插件接口_IDTExtensibility2,它的声明如下:
_IDTExtensibility2=interface(IDispatch)
['{B65AD801-ABAF-11D0-BB8B-00A0C90F2744}']
procedureOnConnection(constApplication:
IDispatch;
ConnectMode:
ext_ConnectMode;constAddInInst:
IDispatch;
varcustom:
PSafeArray);safecall;
procedureOnDisconnection(RemoveMode:
ext_DisconnectMode;
varcustom:
PSafeArray);safecall;
procedureOnAddInsUpdate(varcustom:
PSafeArray);safecall;
procedureOnStartupComplete(varcustom:
PSafeArray);safecall;
procedureOnBeginShutdown(varcustom:
PSafeArray);safecall;
end;
插件安装时,WPSOffice会将插件DLL注册(DllRegisterServer)到系统中。
WPSOffice启动时,将通过插件平台(管理插件的模块)加载插件。
插件平台通过COM方式创建一个_IDTExtensibility2对象,然后调用_IDTExtensibility2.OnConnection。
插件可以在OnConnection中做一些初始化操作,如添加菜单项、工具栏按钮等。
OnConnection之后,OnStartupComplete将被调用,至此插件加载完成。
WPS关闭时,插件平台先后调用OnBeginShutdown和OnDisconnection。
目前,WPSOffice插件平台不会调用插件的_IDTExtensibility2.OnAddInsUpdate方法。
插件实现一个空的OnAddInsUpdate就可以了,即直接返回S_OK,应避免在其中编写其他代码,以免将来引起兼容问题。
下面是对五个方法的详述(来自KingSoft官方文档,翻译成了delphi版):
_IDTExtensibility2.OnConnection
procedureOnConnection(constApplication:
IDispatch;
ConnectMode:
ext_ConnectMode;
constAddInInst:
IDispatch;
varcustom:
PSafeArray);safecall;
OnConnection方法一共带有4个参数。
第一个参数Application是宿主程序对象;第二个参数是ext_ConnectMode类型的枚举值;第三个和第四个参数目前没有使用,插件实现OnConnection时必须忽略这两个参数。
ext_ConnectMode定义了4个常量值,如下所示。
type
ext_ConnectMode=TOleEnum;
const
ext_cm_AfterStartup=$00000000;
ext_cm_Startup=$00000001;
ext_cm_External=$00000002;
ext_cm_CommandLine=$00000003;
其中,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
用于安装插件过程。
安装插件时,WPSOffice插件平台会加载插件,并调用OnConnection(Application,ext_cm_AfterStartup),此时插件要做两件事情,即安装后的初始化以及加载初始化。
如果插件安装以后不需要进一步的配置等初始化工作,那么对这个插件而言,不需要区分ext_cm_AfterStartup和ext_cm_Startup。
一般情况下,插件会在OnConnection中添加菜单项或者工具栏按钮等功能入口。
在WPSOffice添加的菜单项或者工具栏按钮,分为“临时”和“持久”两种类型。
顾名思义,带有“临时”属性的菜单项或工具栏按钮,在WPSOffice重新启动以后就不存在了;带有“持久”属性的菜单项或工具栏按钮,在WPSOffice重新启动以后,仍然存在。
插件添加菜单项和工具栏按钮时,推荐使用“临时”的菜单项和工具栏按钮,在宿主程序关闭时,插件也不要调用API删除菜单或工具栏按钮。
插件添加菜单项或工具栏按钮时,建议先检查这些菜单或按钮是否已经存在,以免重复添加。
_IDTExtensibility2.OnStartupComplete
插件平台加载插件过程中,会先后调用OnConnection和OnStartupComplete。
如果插件需要在插件启动以后(OnConnection执行完之后)做一些事情,可以将这些工作放到OnStartupComplete中执行。
大多数情况下,插件可以实现一个空的OnStartupComplete即可。
_IDTExtensibility2.OnBeginShutdown
WPSOffice关闭过程中,插件平台会调用OnBeginShutdown,通知插件做清理工作,如保存配置、终止未完成的工作、释放系统资源等。
OnBeginShutdown在OnDisconnection之前被调用。
_IDTExtensibility2.OnDisconnection
OnDisconnection和OnConnection相对应,插件在OnConnection中添加菜单或工具栏命令、注册事件通知,OnDisconnection则注销事件通知。
procedureOnDisconnection(RemoveMode:
ext_DisconnectMode;
varcustom:
PSafeArray);safecall;
OnDisconnection带RemoveMode和custom两个参数。
其中custom参数目前没有用到,插件忽略这个参数即可;第一个参数RemoveMode是ext_DisconnectMode类型的枚举值,如下所示:
type
ext_DisconnectMode=TOleEnum;
const
ext_dm_HostShutdown=$00000000;
ext_dm_UserClosed=$00000001;
目前只用到了ext_dm_HostShutdown。
WPSOffice关闭时,插件平台会调用插件的_IDTExtensibility2.OnDisconnection(ext_dm_HostShutdown,custum)方法。
前面推荐插件使用“临时”的菜单和工具栏按钮。
使用“临时”菜单和按钮时,插件在处理ext_dm_HostShutdown过程中不需要删除菜单、按钮等项目。
了解了以上内容,下面开始我们的实现,先创建以下类成员变量:
FApp:
_Application;//我们的WPS文字接口对象
FBtnTest1,FBtnTest2:
_CommandBarButton;//工具栏按钮对象
FConnection1,FConnection2:
Integer;
再添加两个全局常量
const
Btn1TagId='Btn1';
Btn2TagId='Btn2';
我们要靠它们来辨别是哪个按钮被点击了。
我们要关心的具体实现在以下三个函数中,其它函数我们可以不管:
procedureTSimpleAddin.Click(constCtrl:
CommandBarButton;
varCancelDefault:
WordBool);
var
TagId:
WideString;{调用messagebox函数要引用Windows单元。
}
begin
TagId:
=Ctrl.Tag;
ifTagId=Btn1TagIdthen
MessageBox(0,'您点击了按钮一。
','提示',MB_OK+MB_ICONINFORMATION)
elseifTagId=Btn2TagIdthen
MessageBox(0,'您点击了按钮一。
','提示',MB_OK+MB_ICONINFORMATION)
else
Assert(false,'错误的参数');
end;
procedureTSimpleAddin.OnConnection(constapp:
IDispatch;
ConnectMode:
ext_ConnectMode;constAddInInst:
IDispatch;
varcustom:
PSafeArray);
var
ToolBar:
CommandBar;
begin
{获取WPS接口引用}
FApp:
=appas_Application;
{获取标准工具栏接口}
ToolBar:
=FApp.CommandBars.Item['Standard']asCommandBar;
{向标准工具栏对象添加按钮一}
FBtnTest1:
=Toolbar.Controls.Add(ksoControlButton,0,0,ToolBar.Controls.Count+1,True)as_CommandBarButton;
{设置按钮一属性}
withFBtnTest1do
begin
Style:
=ksoButtonCaption;
ToolTipText:
='我的测试一';
Caption:
='测试一';
Tag:
=Btn1TagId;{这个标记是区别不同按钮的}
end;
{将按钮事件连接到我们实现的ICommandBarButtonEvents接口上}
InterfaceConnect(
FBtnTest1,
IID_ICommandBarButtonEvents,
self,
FConnection1);
{向插件工具栏对象添加按钮二}
FBtnTest2:
=Toolbar.Controls.Add(ksoControlButton,0,0,ToolBar.Controls.Count+1,True)as_CommandBarButton;
{设置按钮一属性}
withFBtnTest2do
begin
Style:
=ksoButtonCaption;
ToolTipText:
='我的测试二';
Caption:
='测试二';
Tag:
=Btn2TagId;{这个标记是区别不同按钮的}
end;
{将按钮事件连接到我们实现的ICommandBarButtonEvents接口上}
InterfaceConnect(
FBtnTest2,
IID_ICommandBarButtonEvents,
self,
FConnection2);
end;
ProcedureTSimpleAddin.OnDisconnection(RemoveMode:
ext_DisconnectMode;varcustom:
PSafeArray);
begin
{先断开事件连接。
}
InterfaceDisconnect(
FBtnTest1,DIID__CommandBarButtonEvents,FConnection1);
InterfaceDisconnect(
FBtnTest2,DIID__CommandBarButtonEvents,FConnection2);
{释放FApp接口引用。
}
FApp:
=nil;
end;
代码编写至此,我们的DLL文件算是完成了,编译后就生成了“SimpleLib.dll”,它只实现了简单的功能,就是在标准工具栏上添加两个按钮,点击不同按钮会弹出不同的信息框。
要把它安装到我们的WPSOffice2009中,还要编写一个配置文件,下面我们进行插件配置文件的编写。
四、编写插件配置文件并安装
WPSOffice插件的配置文件是一个符合一定命名规则的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表示支持WPSOffice的所有模块。
c.[lang]
插件支持的语言版本,如1033、2052等。
“0”表示支持所有语言。
假如WpsAddonDemo.dll插件支持WPSOffice的所有模块,支持简体中文,那么它的配置文件名称为“WpsAddonDemo.kso.2052.xml”。
如果插件需要针对WPSOffice的不同模块编写不同的配置文件,那么可以按照以上规则编写多个配置文件。
插件平台优先使用精确匹配的插件配置文件,以WpsAddonDemo插件为例,WPS文字启动时,插件平台先查找名为“WpsAddonDemo.wps.2052.xml”的配置文件,若找不到则继续查找名为“WpsAddonDemo.kso.2052.xml”的配置文件,如果都找不到,则说明该插件不支持WPS文字。
xmlversion="1.0"encoding="utf-8"?
>
--
id:
插件DLL的CLSID。
version:
插件的版本号,1.0.0.0形式的版本号。
将显示在插件平台对话框中。
type:
必须是comaddin。
author:
作者名字。
将显示在插件平台对话框中。
name:
插件名称。
将显示在插件平台对话框中。
desc:
插件简介。
将显示在插件平台对话框中。
image:
插件图标文件(32X32),将显示在WPS插件平台对话框中。
homepage:
插件主页网址。
将在插件平台对话框中显示一个主页按钮。
help:
帮助页面的网址。
将在插件平台对话框中显示一个问号按钮。
loadimm:
必须是“1”。
updateitv:
检查更新的时间间隔,默认为7天。
-->
id="{70D748C8-974D-44C0-8115-9072478A6009}" version="1.0.0.1234" type="comaddin" name="插件示例" author="WPS" desc="WPSOffice插件简介" image="icon.jpg" homepage=" help="" loadimm="1" updateitv="7"/> 图 (1)插件属性示例 插件配置文件中至少要包含id、version、type、name四项数据。 a.id 插件id是插件COM组件的CLSID,WPSOffice插件平台将根据id加载插件,获取_IDTExtensibility2接口。 b.verion 插件版本号使用Windows风格的命名方式,即[主版本号][子版本号][修正版本号][构建],如“1.1.0.29”。 插件版本号会显示在插件平台对话框中。 c.type type必须为comaddin,说明插件DLL是一个COM组件。 d.name 在插件平台对话框中看到的插件名称。 e.loadimm WPS启动时是否立即加载插件,必须为“1”,表示立即加载插件。 我们的插件配置文件名为“SimpleLib.wps.2052.xml”,内容如下: xmlversion="1.0"encoding="UTF-8"? > id="{31257FD7-797F-4D21-A919-6A8F333A077F}" version="1.0.0.0" type="comaddin" author="yulinsoft" name="测试插件" desc="这是一个示例插件,用于演示delphi开发的WPS插件。 " homepage=" help=" loadimm="1" updateitv="2" /> 将XML文件保存到与DLL文件相同的目
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 用Delphi开发Wps Office 插件一二 Delphi 开发 Wps 插件 一二