![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
События в ОЛЕ ??? [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.