![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]> Но если закрыть сервер вручную
я бы сделал сервер сервисом для начала