请教各位专家:如何象金山毒霸嵌入WORD工具栏一样,把自己的按钮添加到EXCEL中,用来启动自己的程序?(200分)

  • 主题发起人 主题发起人 sunyb
  • 开始时间 开始时间
S

sunyb

Unregistered / Unconfirmed
GUEST, unregistred user!
然后读取EXCEL当前行的数据到程序里,用以后续处理
查了很多以前的资料,好象需要编一个DLL文件并注册?
 
不一定要DLL,但是需要很多知识,例如:
1.找到某窗口的句柄。
2.找到他的系统菜单或CoolBar句柄。
3.往句柄上添加菜单或按钮。
或是
知道com对象,往接口上写东西。
等等。
 
1.找到某窗口的句柄。
2.找到他的系统菜单或CoolBar句柄。
3.往句柄上添加菜单或按钮。
这个应该可以实现吧,但是工作模式不一样,我的意思是EXCEL按钮启动自己的程序,
而不是自己的程序去修改已经启动的EXCEL工具栏
 
跟下面的问题是类似的。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2447301
 
不是想象的那么复杂, 其实就是在注册表中定义了一些健值,例如
在ie 中的例子,非常夺得,仅仅是主健不同而已
 
看了OFFICE安装目录的STARTUP下面有一个FOXMAIL.DOT,把它删除,FOXMAIL的按钮没了。难道FOXMAIL就是用修改模板文件的方式加入了按钮?
 
试试比较安装毒霸前后注册表的变化
(用软件监视)
 
不需要的
 
看雪有个注册表和硬盘拍照的软件
拍一下就知道
 
做这个没那么复杂,其实是做EXCEL的插件。
仔细看看EXCEL开发的相关资料就可以。没必要窗口句柄的搞那么高深。
 
注册表或com
 
请问foresail:
EXCEL的插件?能否详细指教?
 
网上的资料都是VC或VB的,找不到DELPHI
Office2000下内部COM插件的编程实现
http://www.vchelp.net/itbookreview/view_paper.asp?paper_id=596
 
用VC实现好象非常简单啊,难道DELPHI把问题复杂化了?
高手在哪里啊?
 
看样子没法解决了,我的分数不多了,能不能回收?
 
参照WORD按钮添加的方法,现在在EXCEL中工具栏是加上了,但是按钮加不上,不知道怎么修改以下代码:
library exceladdin;
uses
ComServ,
exceladdin_TLB in 'exceladdin_TLB.pas',
AddInDesignerObjects_TLB in 'E:/Program Files/Borland/Delphi7/Projects/AddInDesignerObjects_TLB.pas',
main in 'main.pas' {addintest: CoClass},
cmdbarbtn in 'cmdbarbtn.pas';
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
{$R *.TLB}
{$R *.RES}
begin
end.
===================
unit main;
{$WARN SYMBOL_PLATFORM OFF}
interface
uses
ComObj, ActiveX, exceladdin_TLB, StdVcl, AddInDesignerObjects_TLB,
excel2000,office2000,cmdbarbtn;
type
Taddintest = class(TAutoObject, _IDTExtensibility2)
private
FexcelApp : TexcelApplication;
FCommandBarButton : TCommandBarButton;
procedure FClick(const Ctrl: OleVariant;
var CancelDefault: OleVariant);
protected
procedure OnAddInsUpdate(var custom: PSafeArray);
safecall;
procedure Onbegin
Shutdown(var custom: PSafeArray);
safecall;
procedure OnConnection(const Application: IDispatch;
ConnectMode: ext_ConnectMode;
const AddInInst: IDispatch;
var custom: PSafeArray);
safecall;
procedure OnDisconnection(RemoveMode: ext_DisconnectMode;
var custom: PSafeArray);
safecall;
procedure OnStartupComplete(var custom: PSafeArray);
safecall;
public
property excelApp : TexcelApplication read FexcelApp;
end;

implementation
uses ComServ,dialogs;
procedure Taddintest.OnAddInsUpdate(var custom: PSafeArray);
begin

end;

procedure Taddintest.Onbegin
Shutdown(var custom: PSafeArray);
begin

end;

procedure Taddintest.OnConnection(const Application: IDispatch;
ConnectMode: ext_ConnectMode;
const AddInInst: IDispatch;
var custom: PSafeArray);
var
WA : excel2000._Application;
acommandbar:commandbar;
aButton:_CommandBarButton;
emptyparam:OleVariant;
begin
//ShowMessage('Hello excel, Delphi is here!');
FexcelApp := TexcelApplication.Create(nil);
WA := Application as excel2000._Application;
excelApp.ConnectTo(WA);
ShowMessage('Connected to ' + excelApp.Name);
aCommandBar:=excelapp.CommandBars.Add('delphitest',msoBarTop,false,true);
aButton := aCommandBar.Controls.Add(msoControlButton, emptyparam, emptyparam,emptyparam, true) as _CommandBarButton;
aButton.Set_Style(msoButtonIconAndCaption);
aButton.Set_Caption('myTest');
aButton.Set_Tag('test111');
FCommandBarButton := TCommandBarButton.Create(nil);
FCommandBarButton.ConnectTo(aButton);
FCommandBarButton.OnClick := FClick;
aCommandBar.Set_Visible(True);
end;

procedure Taddintest.OnDisconnection(RemoveMode: ext_DisconnectMode;
var custom: PSafeArray);
begin
FCommandBarButton.Disconnect;
FCommandBarButton.Free;
end;

procedure Taddintest.OnStartupComplete(var custom: PSafeArray);
begin

end;

procedure Taddintest.FClick(const Ctrl: OleVariant;
var CancelDefault: OleVariant);
begin
//Ctrl.Application.Selection.TypeText(DateTimeToStr(Now) + #13#10);
showmessage('click me');
end;

initialization
TAutoObjectFactory.Create(ComServer, Taddintest, Class_addintest,
ciMultiInstance, tmApartment);
end.
===========================
unit cmdbarbtn;
interface
uses oleserver,office2000,ActiveX,Classes;
type
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;

implementation
{ 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: '{55F88891-7708-11D1-ACEB-006008961DA5}';
IntfIID: '{000C0351-0000-0000-C000-000000000046}';
EventIID: '{000C0351-0000-0000-C000-000000000046}';
LicenseKey: nil;
Version: 500);
begin
ServerData := @CServerData;
end;

procedure TCommandBarButton.InvokeEvent(DispID: TDispID;
var Params: TVariantArray);
begin
case DispID of
-1: Exit;
// DISPID_UNKNOWN
1: if Assigned(FOnClick) then
FOnClick(Params[0], Params[1]);
end;
{case DispID}
end;

procedure TCommandBarButton.SetOnClick(
const Value: TCommandBarButtonClick);
begin
FOnClick := Value;
end;

end.
 
我帮你顶,这个问题很有用,谁能解决,我加他200分!!!
 
这样的方法论坛上太多了。
不过好像就是没有实现添加一个完整菜单项(例如在“帮助”后添加的)
有谁知道了不妨告诉我。高分相送!
 
可能和这段有关,这是WORD上添加按钮的初始数据,是不是在EXCEL中应该不同?
procedure TCommandBarButton.InitServerData;
const
CServerData: TServerData = (
ClassID: '{55F88891-7708-11D1-ACEB-006008961DA5}';
IntfIID: '{000C0351-0000-0000-C000-000000000046}';
EventIID: '{000C0351-0000-0000-C000-000000000046}';
LicenseKey: nil;
Version: 500);
begin
ServerData := @CServerData;
end;

我在EXCEL9.OLB 中导出获取了
LIBID: {00020813-0000-0000-C000-000000000046}
但是无法取得ClassID
在MSWORD9.OLB 中导出:
LIBID: {00020905-0000-0000-C000-000000000046}
 
其实花57.75美元就可以解决问题的,有一个OFFICE COM ADD-IN EXPRESS组件购买
但是怎么支付呢?
 
后退
顶部