共分兩步
一.寫一個繼承自toleserver的類
unit Unit4;
interface
uses
OleServer, classes, Project1_TLB, Activex;
type
TxzmOleServer = class(TOleServer)
private
Folexzm: ixzmtest;
procedure InitServerData; override;
procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray); override;
procedure Setolexzm(const Value: ixzmtest);
public
FMyServerData: TServerData;
constructor Create(AOwner: TComponent; AMyServer: ixzmtest);
destructor Destroy; override;
// NOTE: If derived class is generated by TLIBIMP or ImportTypeLibraryCodeGenerator,
// the derived class will also expose a 'ConnectTo(interface)' function.
// You must invoke that method if you're using 'ckAttachToInterface' connection
// kind.
procedure Connect; override;
procedure Disconnect; override;
property olexzm: ixzmtest read Folexzm write Setolexzm;
end;
implementation
{ TxzmOleServer }
uses
dialogs, sysutils, Unit3;
procedure TxzmOleServer.Connect;
begin
self.ConnectEvents(olexzm);
end;
constructor TxzmOleServer.Create(AOwner: TComponent; AMyServer: ixzmtest);
begin
olexzm:= AMyServer;
inherited create(AOwner);
end;
destructor TxzmOleServer.Destroy;
begin
inherited;
end;
procedure TxzmOleServer.Disconnect;
begin
self.DisconnectEvents(olexzm);
end;
procedure TxzmOleServer.InitServerData;
begin
FMyServerData.ClassID:= CLASS_xzmtest;
FMyServerData.IntfIID:= IID_Ixzmtest;
FMyServerData.EventIID:= DIID_IxzmtestEvents;
FMyServerData.InstanceCount:= 0;
self.ServerData:= @FMyServerData;
inherited;
end;
procedure TxzmOleServer.InvokeEvent(DispID: TDispID;
var Params: TVariantArray);
begin
inherited;
form3.InvokeEvent(dispid, params);
end;
procedure TxzmOleServer.Setolexzm(const Value: ixzmtest);
begin
Folexzm := Value;
end;
end.
二.建立一個接收com組件事件的界面
unit Unit3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Project1_TLB, StdCtrls, Unit4, activex, oleserver;
type
TForm3 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
FOlexzm: ixzmtest;
Fxzmoleserver: TxzmoleServer;
{ Private declarations }
public
{ Public declarations }
procedure InvokeEvent(DispID: TDispID; var Params: TVariantArray);
property Olexzm: ixzmtest read FOlexzm write FOlexzm;
property xzmOleServer: TxzmoleServer read Fxzmoleserver write Fxzmoleserver;
end;
var
Form3: TForm3;
implementation
{$R *.dfm}
procedure TForm3.FormCreate(Sender: TObject);
begin
Olexzm:= coxzmtest.Create as ixzmtest;
xzmoleserver:= Txzmoleserver.Create(self, olexzm);
end;
procedure TForm3.Button1Click(Sender: TObject);
begin
xzmoleserver.Connect;
end;
procedure TForm3.InvokeEvent(DispID: TDispID; var Params: TVariantArray);
var
i: integer;
begin
memo1.Lines.Add(inttostr(dispid));
for i:= 0 to length(params) - 1 do
begin
memo1.Lines.Add('參數'+inttostr(i)+':'+params[i]);
end;
end;
procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction);
begin
xzmoleserver.Disconnect;
xzmoleserver.Free;
olexzm:= nil;
end;
end.