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

Вниз

COM: обработка исключительных ситуаций   Найти похожие ветки 

 
Magedon   (2011-04-04 13:42) [0]

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

Написал 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 естественно валиться ошибкой. Я хочу проверять если сервер уже не доступен, то попытаться создать его снова.

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


 
clickmaker ©   (2011-04-04 13:46) [1]

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

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


 
Magedon   (2011-04-04 14:11) [2]


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

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


 
clickmaker ©   (2011-04-04 14:15) [3]

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


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


> Magedon   (04.04.11 13:42) 

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


 
Magedon ©   (2011-04-04 15:02) [5]


> 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 15:25) [6]


> 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 16:30) [7]


> DiamondShark ©


Спасибо



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

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

Наверх




Память: 0.48 MB
Время: 0.007 c
15-1300767910
Дмитрий С
2011-03-22 07:25
2011.07.10
Такой же как TWebBrowser, только FireFox?


2-1301468675
Scott Storch
2011-03-30 11:04
2011.07.10
xml (dom)


3-1261385211
Rhododendrom
2009-12-21 11:46
2011.07.10
BackUp/Restore базы данных FireBird из моей программы.


15-1301290908
OW
2011-03-28 09:41
2011.07.10
Поиск по строке аля посковика. Генераторы запроса.


15-1300809539
rxQ
2011-03-22 18:58
2011.07.10
ПО под GPL и платные компоненты