Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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/



Страницы: 1 вся ветка

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

Наверх





Память: 0.45 MB
Время: 0.007 c
1-9207
knyaz17
2002-02-12 12:01
2002.03.04
Как вставить в Word текст из буфера обмена?


1-9110
f0rm
2002-02-15 19:33
2002.03.04
Нужен компонент


1-9183
USAtyj
2002-02-12 18:21
2002.03.04
Про массивы и про High() (+)


1-9139
kaif
2002-02-17 12:56
2002.03.04
Почему много ссылок на BPL?


14-9280
Феликс
2002-01-14 22:03
2002.03.04
А у вас глючил Делфи?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский