Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как проверить, что IUnknown* нужного типа? 
:(
    Опции темы
Dims
Дата 26.10.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Как убедиться, что IUnknown* указывает на нужный тип, например на IBaseFilter*?
PM MAIL   Вверх
xvr
Дата 26.10.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Позвать от него QueryInterface(IID_IBaseFilter...)

PM MAIL   Вверх
Dims
Дата 28.10.2009, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Так это ж не то! Таким образом я создам интерфейс для объекта. Если объект "исповедует" несколько интерфейсов, например, IIface1 и IIface2, то позвав iiface1->QueryInterface(IID_IIface2) я получу ответ. Но сама-то переменная iiface1 была типа IIface1 и этот тип останется мне неизвестным.
PM MAIL   Вверх
xvr
Дата 29.10.2009, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(Dims @ 28.10.2009,  23:46)
Так это ж не то! Таким образом я создам интерфейс для объекта. Если объект "исповедует" несколько интерфейсов, например, IIface1 и IIface2, то позвав iiface1->QueryInterface(IID_IIface2) я получу ответ. 

Объекты в COM представлены ИСКЛЮЧИТЕЛЬНО своими интерфейсами. Т.е. можно считать, что если объект реализует интерфейс IIface2 (т.е. QueryInterface завершился успешно), то это он и есть. 
По крайней мере для IBaseFilter это так. Кроме того, ОБЪЕКТА (не интерфейса) типа IBaseFilter (НЕ производного, а именно его самого) просто не существует, это всегда какой то конкретный фильтр.

Цитата

iiface1->QueryInterface(IID_IIface2) я получу ответ. Но сама-то переменная iiface1 была типа IIface1 и этот тип останется мне неизвестным.
QueryInterface возвращает указатель на запрошенный интерфейс через последний параметр, вот он и будет IIface2. Более того, обе переменные (iiface1 и то, что вернул QueryInterface) будут ссылаться на один и тот же объект

PM MAIL   Вверх
Dims
Дата 29.10.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Цитата(xvr @  29.10.2009,  00:15 Найти цитируемый пост)
Более того, обе переменные (iiface1 и то, что вернул QueryInterface) будут ссылаться на один и тот же объект

Как так может быть в случае, если указатели не наследуют друг друга?
PM MAIL   Вверх
xvr
Дата 29.10.2009, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(Dims @ 29.10.2009,  14:52)
Цитата(xvr @  29.10.2009,  00:15 Найти цитируемый пост)
Более того, обе переменные (iiface1 и то, что вернул QueryInterface) будут ссылаться на один и тот же объект

Как так может быть в случае, если указатели не наследуют друг друга?

У QueryInterface последний параметр описан как IUnknown**, а все COM объекты являются наследниками IUnknown. Так что тут проблем не будет.

Если имеется в виду родственность того, от кого вызывают QueryInterface и того, что он вернул, то они могут и не наследовать друг друга, но они ОБЯЗАННЫ указывать на один и тот же COM объект, т.к. QueryInterface предназначен для запроса ДРУГИХ интерфейсов ОДНОГО объекта, т.е. по своей семантике он не может вернуть интерфейс ДРУГОГО объекта, только того, от интерфейса которого он вызывался.

Не путай COM объект и его интерфейсы, это разные вещи   smile 
PM MAIL   Вверх
Dims
Дата 29.10.2009, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1016
Регистрация: 21.11.2006

Репутация: нет
Всего: 11



Так вот я как раз и не путаю. У меня есть указатель IUnknown*. 

Как узнать, на какой интерфейс он ссылается?

Не получить другой интерфейс того же объекта, а узнать, что за интерфейс упомянут в уже существующем указателе.
PM MAIL   Вверх
xvr
Дата 29.10.2009, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(Dims @ 29.10.2009,  19:11)
Так вот я как раз и не путаю. У меня есть указатель IUnknown*. 

Как узнать, на какой интерфейс он ссылается?

Не получить другой интерфейс того же объекта, а узнать, что за интерфейс упомянут в уже существующем указателе.

При такой постановке вопроса - никак.

Можно попробовать запросить через QueryInterface этот 'другой', а потом сравнить указатели исходного IUnknown и возвращенного из QueryInterface, но это абсолютно ненадежно  smile 

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0906 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.