Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];




Вниз

как получить интерфейс IUnknown 


vic_774N   (2002-02-13 20:51) [0]

Вопрос по COM технологии:

я с COM/OLE не работал так чтовопрос совершенно "чайниковский".
помогите советом или ссылкой на работающий пример (Delphi)
как получить интерфейс IUnknown, нужно ли насильно заполнять IID: TGUID или как-то его запрашивать ?

в общем - очень желателен маленький рабочий примерчик

Спасибо.

вот программка-клиент : место где не работает указано.



unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, OleServer, WINFIOLLib_TLB, Menus, ComObj;
{
const
WFEVENTMASK_NONE = 0; // do not notify any event
WFEVENTMASK_ALL = 255; // notify all possible events
WFEVENTMASK_INIT = 1; // notify initialization and cleanup events
WFEVENTMASK_PORT = 2; // notify change of port status
WFEVENTMASK_LOGIN = 3; // notify login status
WFEVENTMASK_LOGOUT = 4; // notify logout status
WFEVENTMASK_WINDOW = 5; // notify window state events
WFEVENTMASK_CHNL = 6; // notify change of active channel events
WFEVENTMASK_LOCK = 7; // notify lock and unlock events
WFEVENTMASK_TRSM = 8; // notify change of transmission status
WFEVENTMASK_LINE = 9; // notify reception of a line from the target exchange
WFEVENTMASK_PRINTOUT = 10; // notify reception of a printout from the target exchange
WFEVENTMASK_READ = 11; // notify read buffer status change
WFEVENTMASK_SEND = 12; // notify change of MML command send status
}

type
TForm1 = class(TForm)
WFiol: TWinFIOL_Application;
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
Edit1: TEdit;
Button3: TButton;
Button4: TButton;
Button5: TButton;
Button6: TButton;
Button7: TButton;
Button8: TButton;
Button9: TButton;
Button10: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Button8Click(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure WFiolNotify(Sender: TObject; event: Integer;
var text: OleVariant);
procedure Button9Click(Sender: TObject);
procedure Button10Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Channel: IWFChannel;
ChannelEvent: IWFEvent;
pIWFEvent: IUnknown;
Main: IWFMain;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
WFiol.Connect;
WFiol.SetClientName("Test");
Memo1.Text:=IntToStr(WFiol.GetCurrentChannel);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
WFiol.Disconnect;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Channel := nil;
Channel := WFiol.GetChannelPointer(WFiol.GetCurrentChannel);
WFiol.Disconnect;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Channel.SetReadBuffer(8192,0);
Channel.SendCommand(Edit1.Text,true);
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
Channel.TerminalConnect("","");
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
Channel.TerminalRelease;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
Channel.Unadvise;
end;

procedure TForm1.Button7Click(Sender: TObject);
var
Event: IWFEvent; // IWFEvent: IUnknown;
begin
Event.Notify(255,Memo1.Text);
Channel.Advise(Event,255); //Тут ошибка -> Event = nil
end;

procedure TForm1.WFiolNotify(Sender: TObject; event: Integer;
var text: OleVariant);
begin
if event = 255 then Memo1.Lines.Append(text);
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
Channel._Release;
end;

procedure TForm1.Button10Click(Sender: TObject);
begin
//
end;

end.



Макс Черных   (2002-02-13 22:43) [1]

var
Event: IWFEvent; // IWFEvent: IUnknown;
begin
Event.Notify(255,Memo1.Text);
Channel.Advise(Event,255); //Тут ошибка -> Event = nil

Естественно так работать не будет.
События СОМ это просто методы клиента, которые вызывает
сервер. При работе через IConnectionPoint вызов метода
клиента всегда идет через IDispatch.
То есть, для начала, надо где-то реализовать COM объект
поддерживающий интерфейс IDispatch. а уже потом передавать
IUnknown этого объекта в метод IConnectionPoint.Advise.
Тут можно очень долго объяснять, что к чему, лучше
посмотреть очень хорошие примеры на
http://www.techvanguards.com/products/eventsinkimp/




Форум: "Основная";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.03.04;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.73 MB
Время: 0.016 c
1-9232            forrest1              2002-02-15 17:26  2002.03.04  
Как выделить одну строку в DBGrid для SelectedRows


1-9222            Lotus                 2002-02-13 10:33  2002.03.04  
всплывающий список


14-9295           Vampire               2002-01-14 14:18  2002.03.04  
Дипломный проект


3-9054            Стас                  2002-02-06 07:32  2002.03.04  
QuickReport.


14-9294           Val                   2002-01-16 10:53  2002.03.04  
TObject - сам себя??? :)