Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

События в ОЛЕ ??? [D5]


AVD ©   (2002-11-15 10:55:00) 

Есть оле сервер. К нему подключаются клиенты.
Клиенты легко могут посылать на этот сервер команды данные и т.д.
Все это делается по желанию клиента.
Вопрос: А как серверу послать команду или данные клиенту в момент когда захочется серверу ???


----   (2002-11-18 14:01:00) [1]

А кто знает как можно решить такую проблему:
когда мы посылаем сообщение клиенту, который на обработчике события делает, например, ShowMessage, то сервер и остальные клиенты не могут работать до тех пор, пока не нажмешь ОК на месаге. Что можно сделать, чтобы такого не было?


VaS   (2002-11-15 17:22:00) [2]


var
ConnectionPointContainer : IConnectionPointContainer;
ConnectionPoint : IConnectionPoint;
AsyncConnection : integer;

begin
//Callback реализует IMyDataCallback
Callback:=TOPCDataCallback.Create(self);
try
ConnectionPointContainer:=Server as IConnectionPointContainer;
if ConnectionPointContainer <> nil then
begin
ConnectionPointContainer.FindConnectionPoint(IMyDataCallback, ConnectionPoint);
if ConnectionPoint <> nil then
ConnectionPoint.Advise(CallBack as IUnknown, AsyncConnection);
end;
except
ConnectionPoint:=nil;
ConnectionPointContainer:=nil;
end;
end;

После этого сервер вызывает для всех клиентов (см. примеры выше) IMyDataCallback.


----   (2002-11-15 16:57:00) [3]

procedure TServerName.Add_Document(const ADocName: WideString);
function GetEnumerator: IEnumConnections;
var
ConnectionPoint: IConnectionPoint;
Container : IConnectionPointContainer;
begin
OleCheck(QueryInterface(IConnectionPointContainer,Container));
OleCheck(Container.FindConnectionPoint(AutoFactory.EventIID,ConnectionPoint));
ConnectionPoint.EnumConnections(Result);
end;
var
l, i: integer;

Enum: IEnumConnections;
ConnectData: TConnectData;
Fetched: Cardinal;
begin
{Do something}
{Если посылаешь сообщение одному клиенту, то делаешь так
//FEvents.OnAdd_Document(l+1);
для всех смотри код ниже
}
Enum:=GetEnumerator;
if Enum <> nil then begin
while Enum.Next(1,ConnectData,@Fetched) = S_OK do begin
if ConnectData.pUnk <> nil then
(ConnectData.pUnk as IServerNameEvents).OnAdd_Document(l+1);
end;
end;
end;


Adrian_Copil_Minune   (2002-11-15 16:04:00) [4]

Нужно самому этот список создовать в Initialize добовляещь в TTHreadList которого создай в initialization и убивай в finalization unit-а.


AVD   (2002-11-15 15:58:00) [5]

Попробую задать вопрос по другому...
Как получить список подключенных клиентов ?


AVD   (2002-11-15 14:44:00) [6]

Как вызвать событие у всех подключенных клиентов ?
Никак не врублюсь...


----   (2002-11-15 13:30:00) [7]

2 VaS:
Как подписаться на события? Если можно, примерчик....или где можно про это прочитать?


AVD   (2002-11-15 12:37:00) [8]

Компонент получился отлично.
Теперь остался один наленький вопрос.
как это событие вызвать ?


----   (2002-11-15 12:06:00) [9]

Все говорят, что нужно писать соответствующий клиент....но никто не говорит, КАК это делать. Я знаю один вариант, как это сделать. Слушай:
{делаешь сервер с поддержкой событий}
1. New->ActiveX->ActiveX Library
2. New->ActiveX->Automation Object...вот тут-то и нужно не забыть поставить галочку Generate_Event_Support_Mode
Далее добавляешь события (методы) к интерфейсу xxxEvent....короче, если кто хочет, могу посканить и выслать - очень уж много писать.....
{клиент}
Делаешь Import Type Library с галочкой Generate Component Wrapper...далее работаешь как с компонентом (у которого есть все нужные тебе события...которые будут идти от сервера)...

Вот так все легко. Но у меня есть вопрос другого плана.
КАК МОЖНО СДЕЛАТЬ ОБРАБОТКУ СОБЫТИЙ НА КЛИЕНТЕ БЕЗ Import Type Library...Проблема в том, что у меня есть несколько СОМ-серверов, которые реализуют по разному одну задачу (один интерфейс). Как мне написать обработчик событий (одинаковый для всех), при условии, что в рантайме будут переключаться СОМ-сервера (т.е у меня есть только GUID"ы этих серверов....я подключаюсь вначале к одному, работаю с ним, ПРИНИМАЮ события от него......потом переключаюсь к другому, ....)


VaS   (2002-11-15 11:44:00) [10]

Реализуешь в сервере IConnectionPointContainer, далее клиент подписывается на события (Advise). Все довольно просто и красиво.


iNew   (2002-11-15 11:29:00) [11]

Для этого необходимо писать соответствующий клиент.
Вообщем COM.


Наверх

Титульная страница Поиск, карта сайта Написать письмо