用Delphi开发Wps Office 插件一二.docx

上传人:b****6 文档编号:8702688 上传时间:2023-02-01 格式:DOCX 页数:19 大小:206.49KB
下载 相关 举报
用Delphi开发Wps Office 插件一二.docx_第1页
第1页 / 共19页
用Delphi开发Wps Office 插件一二.docx_第2页
第2页 / 共19页
用Delphi开发Wps Office 插件一二.docx_第3页
第3页 / 共19页
用Delphi开发Wps Office 插件一二.docx_第4页
第4页 / 共19页
用Delphi开发Wps Office 插件一二.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

用Delphi开发Wps Office 插件一二.docx

《用Delphi开发Wps Office 插件一二.docx》由会员分享,可在线阅读,更多相关《用Delphi开发Wps Office 插件一二.docx(19页珍藏版)》请在冰豆网上搜索。

用Delphi开发Wps Office 插件一二.docx

用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文件相同的目

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 视频讲堂

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1