Я клиент, и работаю с неким COM-server, я получил от него указатель на IDispatch, все пока хорошо.
Тут внезапно сервер закрылся, я начинаю использовать этот IDispatch и получается что то нехорошее.
Можно ли как нибудь проверить легальность этого IDispatch?
Здравствуйте, lotgon, Вы писали:
L>Я клиент, и работаю с неким COM-server, я получил от него указатель на IDispatch, все пока хорошо. L>Тут внезапно сервер закрылся, я начинаю использовать этот IDispatch и получается что то нехорошее. L>Можно ли как нибудь проверить легальность этого IDispatch?
Так ведь сервер не должен закрыться пока ты не вызовешь Release()
Здравствуйте, lotgon, Вы писали:
L>Я клиент, и работаю с неким COM-server, я получил от него указатель на IDispatch, все пока хорошо. L>Тут внезапно сервер закрылся, я начинаю использовать этот IDispatch и получается что то нехорошее. L>Можно ли как нибудь проверить легальность этого IDispatch?
В принципе, ты должен получать ошибку,что-то вроде "RPC server is unavailable" — это и есть "что то нехорошее" ?
Здравствуйте, Sergey Katsyuba, Вы писали:
SK>Здравствуйте, lotgon, Вы писали:
L>Я клиент, и работаю с неким COM-server, я получил от него указатель на IDispatch, все пока хорошо. L>Тут внезапно сервер закрылся, я начинаю использовать этот IDispatch и получается что то нехорошее. L>Можно ли как нибудь проверить легальность этого IDispatch?
SK>Так ведь сервер не должен закрыться пока ты не вызовешь Release()
Я пока еще слабо понимаю, поэтому на примере.
Я работаю с вордом получил от него указатель, и тут ворд закрывают внешне. Сервер останется в памяти? кто за него отвечает опер сист или сам Ворд?
Здравствуйте, Ivan, Вы писали:
I>Здравствуйте, lotgon, Вы писали:
L>Я клиент, и работаю с неким COM-server, я получил от него указатель на IDispatch, все пока хорошо. L>Тут внезапно сервер закрылся, я начинаю использовать этот IDispatch и получается что то нехорошее. L>Можно ли как нибудь проверить легальность этого IDispatch?
I>В принципе, ты должен получать ошибку,что-то вроде "RPC server is unavailable" — это и есть "что то нехорошее" ?
К сожалению у меня получается гораздо более неприятные результаты: программа выполнила недопустимую операцию, что по моему и должно быть, если пользоваться "испорченным указателем"
L>К сожалению у меня получается гораздо более неприятные результаты: программа выполнила недопустимую операцию, что по моему и должно быть, если пользоваться "испорченным указателем"
это если указатель прямой, а вот если указатель это прокси, то всё гораздо лучше...
Здравствуйте, lotgon, Вы писали:
L>К сожалению у меня получается гораздо более неприятные результаты: программа выполнила недопустимую операцию, что по моему и должно быть, если пользоваться "испорченным указателем"
Нет, неправильно. Ты получаешь указатель не на сам компонент, а на Proxy, которая соединяется со Stub'ом в процессе сервера, а уже сам Stub делает вызовы на компоненте. Поэтому когда серверный процесс (например, Word) закрывается — просто обрывается RPC соединение между Proxy и Stub, а указатель, которым владеет клиент, остается вполне корректным. Когда ты сделаешь на нем новый вызов, Proxy "увидит", что Stub больше недоступен и вернет тебе ошибку "RPC server is unavailable".
P.S. Единственный случай, когда клиент может иметь прямой указатель на компонент — совпадение их потоковых моделей + сервер dll. Если "насильно" выгрузить dll с компонентом, то как раз получится, что у клиента неправильный указатель. Но у тебя, я так понимаю, сервер в exe ?