Опять dynamic_cast против QueryInterface.
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 06.07.04 05:43
Оценка:
Я конечно понимаю что dynamic_cast это не то что нужно использовать для COM интерфейсов, что правильно использовать QueryInterface и т.п. Но все таки, могу ли я использовать dynamic_cast хотя бы для того, что бы узнать, может это мне известная реализация COM интерфейса, хотя бы для оптимизации по скорости работы с этим интерфейсом. Допустим что реализация не имеет своего UUID, поэтому QueryInterface не подходит.
getboost.codeplex.com
citylizard.codeplex.com
Re: Опять dynamic_cast против QueryInterface.
От: Vi2 Удмуртия http://www.adem.ru
Дата: 06.07.04 08:29
Оценка: 1 (1)
Здравствуйте, sergey_shandar, Вы писали:

_>Я конечно понимаю что dynamic_cast это не то что нужно использовать для COM интерфейсов, что правильно использовать QueryInterface и т.п. Но все таки, могу ли я использовать dynamic_cast хотя бы для того, что бы узнать, может это мне известная реализация COM интерфейса, хотя бы для оптимизации по скорости работы с этим интерфейсом.


Никто не может запретить тебе использовать dynamic_cast. Но в СОМе стратегия — QueryInterface.

НО... я не совсем в курсе, как реализуется по стандарту dynamic_cast, но скорее всего на сравнении vtable для нужных типов. Но в таком случае прокси DLL или серверная DLL, поскольку она базируется на своих данных, будет давать несовместимые vtable.

_>Допустим что реализация не имеет своего UUID, поэтому QueryInterface не подходит.


Интерфейсу без разницы есть ли у его реализации UUID или нет. Точно так же и клиенту нет необходимости знать КАКИМ объектом ЭТОТ интерфейс реализован.

Если тебя интересует определение своих реализаций, то делай приватный интерфейс и запрашивай его.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Опять dynamic_cast против QueryInterface.
От: sergey_shandar США http://getboost.codeplex.com/
Дата: 06.07.04 11:15
Оценка:
Здравствуйте, Vi2, Вы писали:

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


_>>Я конечно понимаю что dynamic_cast это не то что нужно использовать для COM интерфейсов, что правильно использовать QueryInterface и т.п. Но все таки, могу ли я использовать dynamic_cast хотя бы для того, что бы узнать, может это мне известная реализация COM интерфейса, хотя бы для оптимизации по скорости работы с этим интерфейсом.


Vi2>Никто не может запретить тебе использовать dynamic_cast.

Может. Смотри ниже.

Vi2>НО... я не совсем в курсе, как реализуется по стандарту dynamic_cast, но скорее всего на сравнении vtable для нужных типов. Но в таком случае прокси DLL или серверная DLL, поскольку она базируется на своих данных, будет давать несовместимые vtable.


По крайней мере proxy/stub dll создает объект который валиться по exception (хотя не факт что должен валиться, повезло видимо). Но, мне хотя бы узнать что, это мой объект (т.е. я его создал в этом адресном простанстве) или это какой то объкт сгенерированный с помощью proxy/stub dll? Если у меня будет средство отвечающее на этот вопрос, то я сам дальше уже буду думать, то ли dynamic_cast попробовать, то ли QueryInterface. Т.е., такой ленивый QueryInterface получаеться.

_>>Допустим что реализация не имеет своего UUID, поэтому QueryInterface не подходит.


Vi2>Интерфейсу без разницы есть ли у его реализации UUID или нет. Точно так же и клиенту нет необходимости знать КАКИМ объектом ЭТОТ интерфейс реализован.

QueryInterface не без разницы В это и проблема.

Vi2>Если тебя интересует определение своих реализаций, то делай приватный интерфейс и запрашивай его.

Вот этого как раз и хотелось избежать. Я понимаю что это решение. Но не нравиться оно мне. Слишком много этих приватных интерфейсов получиться.

Простите за настойчивость, я понимаю что проблема на самом деле решаемая. Но все таки. Можно ли определить — это proxy/stub dll сделала объект, или нет?
getboost.codeplex.com
citylizard.codeplex.com
Re[3]: Опять dynamic_cast против QueryInterface.
От: Vi2 Удмуртия http://www.adem.ru
Дата: 06.07.04 12:32
Оценка: 4 (1)
Здравствуйте, sergey_shandar, Вы писали:

_>Можно ли определить — это proxy/stub dll сделала объект, или нет?


Т.е. был ли маршаллинг или нет? Есть масса способов это сделать. Дело в том, что прокси объекта реализует дополнительные интерфейсы, которые не поддерживает исходный объект. Навскидку, например, IMultiQI, IClientSecurity. Может еще какие есть. Также, в частности, и так можно ИНФО: Как получить Cx из Ix*
Автор: Vi2
Дата: 17.06.02
.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Опять dynamic_cast против QueryInterface.
От: Tom Россия http://www.RSDN.ru
Дата: 06.07.04 12:42
Оценка:
_>>Я конечно понимаю что dynamic_cast это не то что нужно использовать для COM интерфейсов, что правильно использовать QueryInterface и т.п. Но все таки, могу ли я использовать dynamic_cast хотя бы для того, что бы узнать, может это мне известная реализация COM интерфейса, хотя бы для оптимизации по скорости работы с этим интерфейсом.

Vi2>Никто не может запретить тебе использовать dynamic_cast. Но в СОМе стратегия — QueryInterface.


Vi2>НО... я не совсем в курсе, как реализуется по стандарту dynamic_cast, но скорее всего на сравнении vtable для нужных типов. Но в таком случае прокси DLL или серверная DLL, поскольку она базируется на своих данных, будет давать несовместимые vtable.

dynamic_cast базируется на RTTI по этому код если там будет прокси — то просто упадёт.
Народная мудрось
всем все никому ничего(с).
Re[3]: Опять dynamic_cast против QueryInterface.
От: Vi2 Удмуртия http://www.adem.ru
Дата: 06.07.04 13:07
Оценка: +1
Здравствуйте, Tom, Вы писали:

Tom>dynamic_cast базируется на RTTI по этому код если там будет прокси — то просто упадёт.


RTTI может быть реализована многими способами, в частности, и с падением (точно также как и debug/release выделение памяти). Это уже какие руки кривые у компиляторщиков, а им это, скорее всего, и отдано на откуп.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.