Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.006 c
14-93182
[NIKEL]
2002-11-08 18:35
2002.11.28
Куда можно выложить утилитку?


3-92854
Gregory
2002-11-09 09:39
2002.11.28
Удаление записей из Paradox


14-93205
Nico1a
2002-11-07 22:08
2002.11.28
Ищу хостинг


1-93011
dim-
2002-11-18 20:36
2002.11.28
MapInfo


7-93263
SKing
2002-09-26 08:49
2002.11.28
LPT(DOS) and Delphi





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский