Как выбросить исключение в COM-объекте?
От: LionHeart Украина  
Дата: 27.06.03 09:20
Оценка:
Как правильно выбросить исключение в методе обычного COM-объекте?
Re: Никак
От: Vi2 Удмуртия http://www.adem.ru
Дата: 27.06.03 09:29
Оценка:
Здравствуйте, LionHeart, Вы писали:

LH>Как правильно выбросить исключение в методе обычного COM-объекте?

Никак. Правильно — не выбрасывать исключение, а возвращать код ошибки HRESULT. Это единственный валидный путь для сервера.

Клиент может сделать обработку кодов ошибок через исключения — это его право. Пример, врапперы интерфейсов в #import-е.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Я криво задал вопрос :)
От: LionHeart Украина  
Дата: 27.06.03 09:39
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Здравствуйте, LionHeart, Вы писали:


Vi2>

LH>>Как правильно выбросить исключение в методе обычного COM-объекте?

Vi2>Никак. Правильно — не выбрасывать исключение, а возвращать код ошибки HRESULT. Это единственный валидный путь для сервера.

Vi2>Клиент может сделать обработку кодов ошибок через исключения — это его право. Пример, врапперы интерфейсов в #import-е.


Попробую подробнее:
Есть автомэйшн-объект (сервер), вызываю его через вариант, лежит он в exe-шнике. В его Initialize проверяется, не запущена ли его же копия в другой пользовательской сессии. Если уже запущена, его создание должно завершиться исключением, которое появляется на клиенте. Нормальная его работа когда к нему ОДНОМУ подключены несколько клиентов.
Вот про исключение в Initialize я и спрашиваю.
Re[3]: Я криво задал вопрос :)
От: Ахет  
Дата: 27.06.03 09:44
Оценка:
Здравствуйте, LionHeart, Вы писали:

LH>Попробую подробнее:

LH>Есть автомэйшн-объект (сервер), вызываю его через вариант, лежит он в exe-шнике. В его Initialize проверяется, не запущена ли его же копия в другой пользовательской сессии. Если уже запущена, его создание должно завершиться исключением, которое появляется на клиенте. Нормальная его работа когда к нему ОДНОМУ подключены несколько клиентов.
LH>Вот про исключение в Initialize я и спрашиваю.

возвращай E_FAIL грохнеться с треском, а если реализуешь ISupportErrorInfo и перехватишь _com_error будет что ответить пользователю.
Re[3]: Да нет все правильно.
От: Vi2 Удмуртия http://www.adem.ru
Дата: 27.06.03 09:54
Оценка: 7 (1)
Здравствуйте, LionHeart, Вы писали:

LH>Есть автомэйшн-объект (сервер), вызываю его через вариант, лежит он в exe-шнике. В его Initialize проверяется, не запущена ли его же копия в другой пользовательской сессии. Если уже запущена, его создание должно завершиться исключением, которое появляется на клиенте. Нормальная его работа когда к нему ОДНОМУ подключены несколько клиентов.
LH>Вот про исключение в Initialize я и спрашиваю.

Еще раз повторю — нет в СОМ-е исключений. Есть исключения в клиенте — в VB, например, в C++. Сам метод возвращает некий код — 0 (вернее, >=0), если успех, и <0 — если произошла ЛЮБАЯ ошибка. Так обрабатывает обращение к серверу VB — если сервер возвращает код ошибки, VB генерит исключение, а не сервер.

Дело в том, что СОМ сервер может находиться в другом процессе и даже на другой машине. Что тебе от их исключений? Единственный, кто может повляить на клиента своим исключением — это DLL сервер (in-proc сервер или сервер "в-процессе"). Но это не здорово, и запрещено СОМ-ом. Т.е. сервер не должен бросаться исключениями ни-в-коем-случае. Он, если использует исключения в своей работе, должен их обработать ДО возвращения к клиенту.

Как правило, твоя ситуация — сервер (второй) может на все обращения к своим методам возвращать код ошибки. Но лучше не допускать такое положение написанием правильного сервера, чтобы он не грузился второй раз. И т.п.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: Я криво задал вопрос :)
От: EM Великобритания  
Дата: 27.06.03 10:20
Оценка:
Здравствуйте, LionHeart, Вы писали:

Нормальная его работа когда к нему ОДНОМУ подключены несколько клиентов.

А может Вам SINGLETON заюзать ?
Опыт — это такая вещь, которая появляется сразу после того, как была нужна...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.