Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.28;
Скачать: CL | DM;

Вниз

События в ОЛЕ ???   Найти похожие ветки 

 
AVD   (2002-11-15 10:55) [0]

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


 
iNew ©   (2002-11-15 11:29) [1]

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


 
VaS ©   (2002-11-15 11:44) [2]

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


 
----   (2002-11-15 12:06) [3]

Все говорят, что нужно писать соответствующий клиент....но никто не говорит, КАК это делать. Я знаю один вариант, как это сделать. Слушай:
{делаешь сервер с поддержкой событий}
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"ы этих серверов....я подключаюсь вначале к одному, работаю с ним, ПРИНИМАЮ события от него......потом переключаюсь к другому, ....)


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

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


 
----   (2002-11-15 13:30) [5]

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


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

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


 
AVD   (2002-11-15 15:58) [7]

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


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

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


 
----   (2002-11-15 16:57) [9]

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;


 
VaS ©   (2002-11-15 17:22) [10]


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-18 14:01) [11]

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



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

Текущий архив: 2002.11.28;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
3-92887
ger
2002-11-11 10:15
2002.11.28
Ошибка при удалении


6-93158
Дмитрий К.К.
2002-10-01 15:52
2002.11.28
Веб-браузер


1-93035
AlexT1000
2002-11-19 13:09
2002.11.28
КАК у ToolButton выставить фонт Caption?!


1-93141
Ежик
2002-11-18 11:31
2002.11.28
Шифрование данных....


1-93003
KidMan
2002-11-13 00:43
2002.11.28
Word и свойства Font