Re[2]: Обработка ошибок в COM
От: Аноним  
Дата: 12.07.02 02:10
Оценка:
Здравствуйте Vi2, Вы писали:

Vi2>Вызов метода несуществующего объекта (изчезнувшего легально или аварийно), >скорей всего, вернётся с кодом ошибки RPC_E_XXXX или CO_E_XXX_RPC_XXXX. Во >всяком случае, код ошибки не будет связан с работой объекта. Для этого и есть >требование СОМ, чтобы любой метод имел сигнатуру HRESULT fff(...), >обеспечивающей возврат ошибки от RPC. Однако здесь же лежат ошибки, связанные с >таймаутами соединения.


Провел эксперименты. И в случае клиента, и в случае сервера, при вызове метода
умершего объекта возвращается ошибка RPC_S_SERVER_UNAVAILABLE. Правда, пускалось все в пределах одной машины.

Vi2>PS

Vi2>Упадёт-упадёт... А если "Что будет, если клиент закончит работу (нормальный выход) и не освободит объект сервера?"
Vi2>Для сервера это тоже ведь плохо. Не так ли.

Ну это-то как раз нетрудно предусмотреть. При нормальном завершении клиента, он может отписаться от сервера перед тем, как закрыться. Точно так же если сервер закрывается корректно, он может сообщить клиентам о этом (через тот же механизм событий), и они отключатся от сервера.

Проблема как раз в некорректном закрытии одного из компонентов. Но здесь вроде тоже ясность наступила (надо отслеживать HRESULT).

Остался вопрос не столько технологии, сколько алгоритма: как клиенту восстановить соединение? Единственное, что пока приходит в голову: периодически (c некоторым заданным интервалом, скажем 5 секунд) вызывать CoCreateInstance до тех пор, пока это не увенчается успехом. Есть какие-нибудь идеи по этому поводу?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.