Office2000(2003) 下 outlook,word 的 com addin 之 delphi实现!(整理摸索)[1]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 andyle 的 blog

       在office2000下的word2000、access2000、excel2000、powerpoint2000等软件中的工具条或菜单条资源中,看到一些其它软件加入的新的
自定义工具条按钮或菜单条,当点击它们时,会有其不同的响应发生。在这里我们不用vb/vba也不用vc6来实现它,而是用delphi(5,6,7)适用开发具有这种效果的office2000内部com插件。在office2000中,不管是word2000、access2000、excel120000、powerpoint2000还是outlook2000等,它们com插件的编程方法及步骤都是极其相似的(除注册表中键值及导入相应类型库不同外),具体的编程差别我会注明在程序中。
       一个office2000下的内部com插件必须实现一个_idtextensibility2派发接口,_idtextensibility2派发接口被定义在msaddin designer类型库(msaddndr.dll/msaddndr.tlb)中,通常位于<盘符>/program files/common files/designer下。_idtextensibility2接口中必须实现下面五个接口涵数(一般只需编写onconnection和ondisconnection中代码,并且delphi自动生成框架),分别如下:
1.         onconnection:           装载插件到内存时处理(可以通过自动化在程序启动时自动装载插件)。
2.         ondisconnection:       从内存中缷载插件时处理。
3.         onaddinsupdate:        com插件改变时处理。
4.         onstartupcomplete: 当应用程序启动时插件刚装载完成时处理。
5.         onbeginshutdown:     当应用程序关闭时插件刚缷载完成时处理。
       只有在正确注册了相应应用程序的内部com插件时,才能被其应用程序加载上,你会在outlook 或者 word等的工具-〉com加载项中看到注册了的com插件。需要在注册表中创建以下键值:hkey_current_user\software\microsoft\office\<theofficeapp>\addins\<progid>
其中,theofficeapp表示相应程序名,如:word、outlook等,progid表示内部com插件程序的唯一标识符的字符串表示形式,如:project1.myoutlookaddin等。
progid键值下主要创建以下键值:
1.        friendlyname:        字符串类型,插件的名称,将在相应程序的com加载对话框中看到。
2.        loadbehavior:        双字节类型,决定插件将以什么形式被装载。当其值为0x03时,为应用程序装载时被自动装载(一般使用此值)、当其值为0x08时,为用户控制激活装载。

com加载

下面,我给大家详细说明制作过程:

1,新建 active library,保存为 project1,这就是progid的前面部分
2,新建com object,在class name中填写 myoutlookaddin,这将是progid的后面部分,点一下implemented interface后面的list按钮。再点一下对话框中的add library按钮,选择“program files\common files\designer”目录下的msaddndr.dll文件。然后在列表中找到msaddndr.dll里面的_idtextensibility2接口点击确定。现在com addin部分已经完成,现在要在outlook里面加一个commandbar和两个按钮,并且让按钮响应用户自定义事件

3,创建一个新的unit,主要新建一个tcommandbarbutton的oleserver类以连接到commandbutton并响应事件,记得,一定要引用 office2000, outlook2000单元。代码:如下
定义部分
tcommandbarbuttonclick = procedure(const ctrl: olevariant; var canceldefault: olevariant) of object;
tcommandbarbutton = class(toleserver)
private
 fintf:        commandbarbutton;
 fonclick: tcommandbarbuttonclick;
 function getdefaultinterface: commandbarbutton;
 procedure setonclick(const value: tcommandbarbuttonclick);
protected
 procedure initserverdata; override;
 procedure invokeevent(dispid: tdispid; var params: tvariantarray); override;
public
 constructor create(aowner: tcomponent); override;
 destructor  destroy; override;
 procedure connect; override;
 procedure connectto(svrintf: commandbarbutton);
 procedure disconnect; override;
 property defaultinterface: commandbarbutton read getdefaultinterface;
published
 property onclick : tcommandbarbuttonclick read fonclick write setonclick;
end;
//实施部分

{ tcommandbarbutton }

procedure tcommandbarbutton.connect;
var
punk: iunknown;
begin
if fintf = nil then
begin
   punk := getserver;
   connectevents(punk);
   fintf:= punk as commandbarbutton;
end;
end;

procedure tcommandbarbutton.connectto(svrintf: commandbarbutton);
begin
  disconnect;
  fintf := svrintf;
  connectevents(fintf);
end;

constructor tcommandbarbutton.create(aowner: tcomponent);
begin
  inherited;
end;

destructor tcommandbarbutton.destroy;
begin
  inherited;
end;

procedure tcommandbarbutton.disconnect;
begin
  if fintf <> nil then
  begin
    disconnectevents(fintf);
    fintf := nil;
  end;
end;

function tcommandbarbutton.getdefaultinterface: commandbarbutton;
begin
  if fintf = nil then
    connect;
  assert(fintf <> nil, 'defaultinterface is null. component is not connected to server. you must call ''connect''        or ''connectto'' before this operation');
  result := fintf;
end;

procedure tcommandbarbutton.initserverdata;
const
  cserverdata: tserverdata = (
  classid:   '{c45bdf5c-8430-4e26-97ef-b3624198366d}'; //随便3个guid

本文关键:outlook,word ,com addin
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top