Здравствуйте 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 до тех пор, пока это не увенчается успехом. Есть какие-нибудь идеи по этому поводу?