Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

COM: обработка исключительных ситуаций [D6, XP]


Magedon ©   (2011-04-04 13:42:00) 

Доброе время суток.

Написал COM сервер. Пишу клиент.

В клиенте работа с сервером реализована так


TForm1 = class(TForm)
...
private
FServer: IServer;
...
function TForm1.CallServerMethod: boolean;
begin
 if  not Assigned(FServer) then
   FServer := CoServer.Create;

 try
   FServer.Method1;
   Result := True;
 except
   on E: Exception do
   begin
     Log(E.Message);
     Result := False;
   end;
 end;
end;


Так вот. Всё работает нормально. Но если закрыть сервер вручную, то проверка if  not Assigned(FServer) thenне проходит. Т.е. объект FServer существует.

Но при попытке вызова метода FServer.Method1 естественно валиться ошибкой. Я хочу проверять если сервер уже не доступен, то попытаться создать его снова.

Как правильно это сделать?


Magedon   (2011-04-04 16:30:00) [1]


> DiamondShark ©


Спасибо


DiamondShark   (2011-04-04 15:25:00) [2]


> Magedon ©   (04.04.11 15:02) [5]



try
  FServer.Method1;
  Result := True;
except
  on E: EOleSysError do
    // здесь анализируем E.ErrorCode, это и есть HRESULT safecall-метода
end;


Magedon   (2011-04-04 15:02:00) [3]


> DiamondShark ©   (04.04.11 14:25) [4]


Такс. Если еще конкренее, то методы на стороне сервера реализованы с входным параметром [out, retvail].

HRESULT _stdcall GetName([out, retval] BSTR * WS );

Делфи это оборачивает как функции

 IServer = interface(IDispatch)
   ['{3F47627D-79D7-4936-9341-07C915A85D12}']
   function GetName: WideString; safecall;
   ...
 end;


Как мне получить на стороне клиента HRESULT, если функция представлена так, что возвращает строку, булеан  или еще какой-нить тип?


DiamondShark   (2011-04-04 14:25:00) [4]


> Magedon   (04.04.11 13:42) 

При закрытии сервера вручную вызов методов валится со вполне конкретным HRESULT.


clickmaker   (2011-04-04 14:15:00) [5]

сложнее закрыть сервер вручную. + автозапуск при перезагрузке компа, например


Magedon   (2011-04-04 14:11:00) [6]


> я бы сделал сервер сервисом для начала

А что это даст?


clickmaker   (2011-04-04 13:46:00) [7]

> Но если закрыть сервер вручную

я бы сделал сервер сервисом для начала


Наверх

Титульная страница Поиск, карта сайта Написать письмо