Форум: "Основная";
Текущий архив: 2002.11.28;
Скачать: [xml.tar.bz2];
ВнизСобытия в ОЛЕ ??? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c