Office2000(2003) 下 outlook,word 的 com add…

2008-02-23 07:18:17来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

在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时,为用户控制激活装载。

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

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
IntfIID: '{A30AF5AC-D1FD-486a-8C7E-F71416EAFC4B}';

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:delphi 7.0生成的AgentObjects_TLB.pas出错导至Ms Agent不能发声

下一篇:儿时的编程算法心得笔记