Здравствуйте, Vi2, Вы писали:
Vi2>Здравствуйте, LionHeart, Вы писали:
Vi2>
LH>>Как правильно выбросить исключение в методе обычного COM-объекте?
Vi2>Никак. Правильно — не выбрасывать исключение, а возвращать код ошибки HRESULT. Это единственный валидный путь для сервера.
Vi2>Клиент может сделать обработку кодов ошибок через исключения — это его право. Пример, врапперы интерфейсов в #import-е.
Попробую подробнее:
Есть автомэйшн-объект (сервер), вызываю его через вариант, лежит он в exe-шнике. В его Initialize проверяется, не запущена ли его же копия в другой пользовательской сессии. Если уже запущена, его создание должно завершиться исключением, которое появляется на клиенте. Нормальная его работа когда к нему ОДНОМУ подключены несколько клиентов.
Вот про исключение в Initialize я и спрашиваю.
Здравствуйте, LionHeart, Вы писали:
LH>Попробую подробнее: LH>Есть автомэйшн-объект (сервер), вызываю его через вариант, лежит он в exe-шнике. В его Initialize проверяется, не запущена ли его же копия в другой пользовательской сессии. Если уже запущена, его создание должно завершиться исключением, которое появляется на клиенте. Нормальная его работа когда к нему ОДНОМУ подключены несколько клиентов. LH>Вот про исключение в Initialize я и спрашиваю.
возвращай E_FAIL грохнеться с треском, а если реализуешь ISupportErrorInfo и перехватишь _com_error будет что ответить пользователю.
LH>Есть автомэйшн-объект (сервер), вызываю его через вариант, лежит он в exe-шнике. В его Initialize проверяется, не запущена ли его же копия в другой пользовательской сессии. Если уже запущена, его создание должно завершиться исключением, которое появляется на клиенте. Нормальная его работа когда к нему ОДНОМУ подключены несколько клиентов.
LH>Вот про исключение в Initialize я и спрашиваю.
Еще раз повторю — нет в СОМ-е исключений. Есть исключения в клиенте — в VB, например, в C++. Сам метод возвращает некий код — 0 (вернее, >=0), если успех, и <0 — если произошла ЛЮБАЯ ошибка. Так обрабатывает обращение к серверу VB — если сервер возвращает код ошибки, VB генерит исключение, а не сервер.
Дело в том, что СОМ сервер может находиться в другом процессе и даже на другой машине. Что тебе от их исключений? Единственный, кто может повляить на клиента своим исключением — это DLL сервер (in-proc сервер или сервер "в-процессе"). Но это не здорово, и запрещено СОМ-ом. Т.е. сервер не должен бросаться исключениями ни-в-коем-случае. Он, если использует исключения в своей работе, должен их обработать ДО возвращения к клиенту.
Как правило, твоя ситуация — сервер (второй) может на все обращения к своим методам возвращать код ошибки. Но лучше не допускать такое положение написанием правильного сервера, чтобы он не грузился второй раз. И т.п.