Как проверить легальность IDispatch?
От: lotgon Беларусь  
Дата: 28.04.03 07:26
Оценка:
Я клиент, и работаю с неким COM-server, я получил от него указатель на IDispatch, все пока хорошо.
Тут внезапно сервер закрылся, я начинаю использовать этот IDispatch и получается что то нехорошее.
Можно ли как нибудь проверить легальность этого IDispatch?
Re: Как проверить легальность IDispatch?
От: Sergey Katsyuba  
Дата: 28.04.03 07:29
Оценка:
Здравствуйте, lotgon, Вы писали:

L>Я клиент, и работаю с неким COM-server, я получил от него указатель на IDispatch, все пока хорошо.

L>Тут внезапно сервер закрылся, я начинаю использовать этот IDispatch и получается что то нехорошее.
L>Можно ли как нибудь проверить легальность этого IDispatch?

Так ведь сервер не должен закрыться пока ты не вызовешь Release()
Re: Как проверить легальность IDispatch?
От: Ivan Россия www.rsdn.ru
Дата: 28.04.03 07:36
Оценка:
Здравствуйте, lotgon, Вы писали:

L>Я клиент, и работаю с неким COM-server, я получил от него указатель на IDispatch, все пока хорошо.

L>Тут внезапно сервер закрылся, я начинаю использовать этот IDispatch и получается что то нехорошее.
L>Можно ли как нибудь проверить легальность этого IDispatch?

В принципе, ты должен получать ошибку,что-то вроде "RPC server is unavailable" — это и есть "что то нехорошее" ?
Re[2]: Как проверить легальность IDispatch?
От: lotgon Беларусь  
Дата: 28.04.03 07:38
Оценка:
Здравствуйте, Sergey Katsyuba, Вы писали:

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


L>Я клиент, и работаю с неким COM-server, я получил от него указатель на IDispatch, все пока хорошо.

L>Тут внезапно сервер закрылся, я начинаю использовать этот IDispatch и получается что то нехорошее.
L>Можно ли как нибудь проверить легальность этого IDispatch?

SK>Так ведь сервер не должен закрыться пока ты не вызовешь Release()


Я пока еще слабо понимаю, поэтому на примере.

Я работаю с вордом получил от него указатель, и тут ворд закрывают внешне. Сервер останется в памяти? кто за него отвечает опер сист или сам Ворд?
Re[2]: Как проверить легальность IDispatch?
От: lotgon Беларусь  
Дата: 28.04.03 11:14
Оценка:
Здравствуйте, Ivan, Вы писали:

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


L>Я клиент, и работаю с неким COM-server, я получил от него указатель на IDispatch, все пока хорошо.

L>Тут внезапно сервер закрылся, я начинаю использовать этот IDispatch и получается что то нехорошее.
L>Можно ли как нибудь проверить легальность этого IDispatch?

I>В принципе, ты должен получать ошибку,что-то вроде "RPC server is unavailable" — это и есть "что то нехорошее" ?


К сожалению у меня получается гораздо более неприятные результаты: программа выполнила недопустимую операцию, что по моему и должно быть, если пользоваться "испорченным указателем"
Re[3]: Как проверить легальность IDispatch?
От: Tom Россия http://www.RSDN.ru
Дата: 28.04.03 12:17
Оценка:
L>К сожалению у меня получается гораздо более неприятные результаты: программа выполнила недопустимую операцию, что по моему и должно быть, если пользоваться "испорченным указателем"
это если указатель прямой, а вот если указатель это прокси, то всё гораздо лучше...
... << RSDN@Home 1.0 beta 6a >>
Народная мудрось
всем все никому ничего(с).
Re[3]: Как проверить легальность IDispatch?
От: Ivan Россия www.rsdn.ru
Дата: 28.04.03 16:16
Оценка:
Здравствуйте, lotgon, Вы писали:

L>К сожалению у меня получается гораздо более неприятные результаты: программа выполнила недопустимую операцию, что по моему и должно быть, если пользоваться "испорченным указателем"


Нет, неправильно. Ты получаешь указатель не на сам компонент, а на Proxy, которая соединяется со Stub'ом в процессе сервера, а уже сам Stub делает вызовы на компоненте. Поэтому когда серверный процесс (например, Word) закрывается — просто обрывается RPC соединение между Proxy и Stub, а указатель, которым владеет клиент, остается вполне корректным. Когда ты сделаешь на нем новый вызов, Proxy "увидит", что Stub больше недоступен и вернет тебе ошибку "RPC server is unavailable".

P.S. Единственный случай, когда клиент может иметь прямой указатель на компонент — совпадение их потоковых моделей + сервер dll. Если "насильно" выгрузить dll с компонентом, то как раз получится, что у клиента неправильный указатель. Но у тебя, я так понимаю, сервер в exe ?
Re[3]: Как проверить легальность IDispatch?
От: Евгений Коробко  
Дата: 01.05.03 04:05
Оценка:
L>Я работаю с вордом получил от него указатель, и тут ворд закрывают внешне. Сервер останется в памяти? кто за него отвечает опер сист или сам Ворд?

Ворд выгрузится. А proxy в твоей программе останется. Эта прокси и должна отловить ошибку.

Впрочем, ЛЮБОЙ удаленный вызов (в смысле, вызов другого процесса) нужно обрамлять в try...catch
... << RSDN@Home 1.0 beta 6a >>
Евгений Коробко
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.