![]() |
|
|
![]()
|
|
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Как убедиться, что IUnknown* указывает на нужный тип, например на IBaseFilter*?
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Позвать от него QueryInterface(IID_IBaseFilter...)
|
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Так это ж не то! Таким образом я создам интерфейс для объекта. Если объект "исповедует" несколько интерфейсов, например, IIface1 и IIface2, то позвав iiface1->QueryInterface(IID_IIface2) я получу ответ. Но сама-то переменная iiface1 была типа IIface1 и этот тип останется мне неизвестным.
|
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
Объекты в COM представлены ИСКЛЮЧИТЕЛЬНО своими интерфейсами. Т.е. можно считать, что если объект реализует интерфейс IIface2 (т.е. QueryInterface завершился успешно), то это он и есть. По крайней мере для IBaseFilter это так. Кроме того, ОБЪЕКТА (не интерфейса) типа IBaseFilter (НЕ производного, а именно его самого) просто не существует, это всегда какой то конкретный фильтр.
|
||||
|
|||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
||||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
У QueryInterface последний параметр описан как IUnknown**, а все COM объекты являются наследниками IUnknown. Так что тут проблем не будет. Если имеется в виду родственность того, от кого вызывают QueryInterface и того, что он вернул, то они могут и не наследовать друг друга, но они ОБЯЗАННЫ указывать на один и тот же COM объект, т.к. QueryInterface предназначен для запроса ДРУГИХ интерфейсов ОДНОГО объекта, т.е. по своей семантике он не может вернуть интерфейс ДРУГОГО объекта, только того, от интерфейса которого он вызывался. Не путай COM объект и его интерфейсы, это разные вещи |
|||
|
||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: нет Всего: 11 |
Так вот я как раз и не путаю. У меня есть указатель IUnknown*.
Как узнать, на какой интерфейс он ссылается? Не получить другой интерфейс того же объекта, а узнать, что за интерфейс упомянут в уже существующем указателе. |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 8 Всего: 223 |
При такой постановке вопроса - никак. Можно попробовать запросить через QueryInterface этот 'другой', а потом сравнить указатели исходного IUnknown и возвращенного из QueryInterface, но это абсолютно ненадежно |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |