Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Com Automation Object, проверка доступности клиента 
:(
    Опции темы
Fedia
Дата 25.9.2006, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: нет
Всего: 13



Приветствую всех !

Столкнулся вот с какой задачей:
Реализован внешний Com-сервер автоматизации (Automation Object), обеспечивающий обратную связь со своими клиентами посредством событий:
Код

TDateListVes = class(TAutoObject, IConnectionPointContainer, IDateListVes)

//...

function TDateListVes.GetconnectionEnamerator: IEnumConnections;
var
  Container: IConnectionPointContainer;
  CP: IConnectionPoint;
begin
  Result:=nil;
  OleCheck(QueryInterface(IConnectionPointContainer, Container));
  OleCheck(Container.FindConnectionPoint(AutoFactory.EventIID, CP));
  CP.EnumConnections(Result);
end;

procedure TDateListVes.DoChange;
var
  EC: IEnumConnections;
  ConnectData: TConnectData;
  Fetched: Cardinal;
begin
  EC:=GetconnectionEnamerator;
  if EC <> nil then
  begin
    while EC.Next(1, ConnectData, @Fetched) = S_OK do
    if ConnectData.pUnk <> nil then
    if Assigned(ConnectData.pUnk) then
    try
      (ConnectData.pUnk as IDateListVesEvents).OnChange; //здесь получаем AV
    except
    end;  
  end;
end;

В процедуре DoChange получаем перечень клиентов сервера, затем перебираем клиентов и генерируем на их "стоках" событие OnChange. При закрытии программы - клиента на OnClose главной формы осуществляется отключение от сервера автоматизации:
Код

    ListCX: IDateListVes;
    //...
    InterfaceDisconnect(ListCX, IDateListVesEvents, FCookie);
    FEventSink.Free;
    ListCX:=nil;

Проблема в том, что приложение - клиент может быть закрыто через диспетчер задач (вкладка "Процессы") или какой-либо другой тяжелой артиллерией и процедура отключения от сервера не сработает -> сервер не будет знать о том, что клиент отключился и при попытка генерации события на "стоке" клиента он получит ошибку AV. Я поставил заглушку в виде блока try..except, но это ведь не дело. Подскажите как перед генерацией события мне проверить доступность клиента ?

ЗЫ: описал задачу как смог, если понадобятся уточнения, то спрашивайте.


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
drkot
Дата 25.9.2006, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



Использование исключений это правильный путь, они для этой цели и созданы.
Нужно только добавить обработчик исключения который удалит клиента из списка, чтобы не возникало ошибок вдальнейшем.



--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Fedia
Дата 26.9.2006, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 465
Регистрация: 2.8.2006
Где: первым встречаю р ассвет

Репутация: нет
Всего: 13



Цитата(drkot @  25.9.2006,  12:35 Найти цитируемый пост)
Нужно только добавить обработчик исключения который удалит клиента из списка, чтобы не возникало ошибок в дальнейшем.

По хорошему, если все же использовать try...except, то нужно конечно удалить клиента из перечня подключений, но реализовать это у меня не получается. Пробовал так:
Код

    try
      (ConnectData.pUnk as IDateListVesEvents).OnChange;
    except
      InterfaceDisconnect(ConnectData.pUnk, IDateListVesEvents, ConnectData.dwCookie);
      ConnectData.pUnk:=nil;
    end;

Да и все равно не хочется мне ловить в программе ошибки (тем более AV), т.к. это может быть чревато различными проблемами в дальнейшем. Поэтому вопрос о проверке доступности клиента остается открытым. B еще добавился вопрос: как в обработчике except…end уведомить сервер, что клиент  ConnectData.pUnk  отключился.


--------------------
Накануне решающей битвы
Я иду, и надеждою зыбкой
Озаряется эта дорога,
Я мечтаю увидеть улыбку
На лице победившего Бога…
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0624 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.