Поиск:

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


Эксперт
***


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

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



IMoniker объекта позволяет получить FriendlyName объекта и сам объект. 

А как получить FirendlyName если у меня есть только сам объект в виде IUnknonw*?
PM MAIL   Вверх
xvr
Дата 28.10.2009, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Никак. IUnknown не обязан поддерживать FriendlyName. Можно попробовать извлечь из IUnknown какой нибудь интерфейс (через QueryInterface) способный создать Moniker (например IPersistMoniker или еще чего нибудь).
А зачем вообще понадобилось это FriendlyName?

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


Эксперт
***


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

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



Я работаю с DirectShow. Эта система, с моей скромной точки зрения, написана сумбурно, поэтому всё приходится контролировать. Я распечатываю в отладочных целях все этапы: что, где, когда и так далее. 

Мне логически непонятно. Вот я создаю энумератор устройств. Этот энумератор выдаёт мне моникеры. Каждый моникер позволяет мне получить френдли имя. Ну я перебрал устройства, потом выбрал нужное, для чего попросил моникера прибиндиться к объекту. Всё, объект я получил, моникер можно выкинуть. Но тогда получается, что френдли имя пропадает. Как же его узнать потом?

Может быть, любой IUnknown можно попросить QueryInterface дать мне IMoniker? И, если получится, тогда это будет моникер того объекта?
PM MAIL   Вверх
xvr
Дата 28.10.2009, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Dims @ 28.10.2009,  15:46)
Мне логически непонятно. Вот я создаю энумератор устройств. Этот энумератор выдаёт мне моникеры. Каждый моникер позволяет мне получить френдли имя. Ну я перебрал устройства, потом выбрал нужное, для чего попросил моникера прибиндиться к объекту. Всё, объект я получил, моникер можно выкинуть. Но тогда получается, что френдли имя пропадает. Как же его узнать потом?

Не выкидывайте моникер. 
Аналогичный пример:
Код

FILE* f=fopen("my_file.txt","rt");
Как по f узнать имя файла?
Цитата

Может быть, любой IUnknown можно попросить QueryInterface дать мне IMoniker?
Попросить можно, но вряди даст  smile 
Цитата

И, если получится, тогда это будет моникер того объекта?
То же не факт. Моникер будет прибинден к тому же объекту, но он не обязан быть тем же, и с тем же FriendlyName

Добавлено через 1 минуту и 43 секунды
Кстати, насколько я помню в DS устройства производные не от голого IUnknown, а от чего то посложнее. У этого 'чего то' нет случайно метода для получения какого нибудь FriendlyName?

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


Эксперт
***


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

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



Цитата(xvr @  28.10.2009,  19:19 Найти цитируемый пост)
Моникер будет прибинден к тому же объекту, но он не обязан быть тем же, и с тем же FriendlyName

Вообще-то мне не надо, чтобы с тем же. Мне нужно ровно то, что написано -- FriendlyName объекта. 

Хотя непонятно, что это может быть за "другое" имя? Система может самостоятельно сочинить и выдать в качестве имени главу из Евгения Онегина?

Добавлено через 1 минуту и 7 секунд
Цитата(xvr @  28.10.2009,  19:19 Найти цитируемый пост)
У этого 'чего то' нет случайно метода для получения какого нибудь FriendlyName?

Есть, но там пусто smile 
PM MAIL   Вверх
xvr
Дата 29.10.2009, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Dims @ 28.10.2009,  23:40)
Хотя непонятно, что это может быть за "другое" имя? Система может самостоятельно сочинить и выдать в качестве имени главу из Евгения Онегина?

Может. 
Цитата

GetDisplayName provides a string that is a displayable representation of the moniker. A display name is not a complete representation of a moniker's internal state; it is simply a form that can be read by users. As a result, it is possible (though rare) for two different monikers to have the same display name. While there is no guarantee that the display name of a moniker can be parsed back into that moniker when calling the MkParseDisplayName function with it, failure to do so is rare.


Цитата

Добавлено @ 23:41
Цитата(xvr @  28.10.2009,  19:19 Найти цитируемый пост)
У этого 'чего то' нет случайно метода для получения какого нибудь FriendlyName?

Есть, но там пусто smile
Тогда увы.
Рекомендую хранить Moniker'ы

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


Эксперт
***


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

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



Цитата(xvr @  29.10.2009,  00:21 Найти цитируемый пост)
Может. 

Логика сего мне непонятна. Если у объекта есть свойство, то почему оно произвольно?

Цитата(xvr @  29.10.2009,  00:21 Найти цитируемый пост)
Рекомендую хранить Moniker'ы

Решение понятно, непонятна идеология...

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


Эксперт
****


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

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



Цитата(Dims @ 29.10.2009,  11:05)
Цитата(xvr @  29.10.2009,  00:21 Найти цитируемый пост)
Может. 

Логика сего мне непонятна. Если у объекта есть свойство, то почему оно произвольно?

Это свойство моникера, а не объекта. И оно не совсем произвольно, оно не является уникальным. Прдставь себе, что все объекты лежат в файловой системе. В таком случае именем объекта будет путь из корня до объекта. Теперь представь, что эта файловая система поддерживает ссылки. При этом становится возможным добраться до объекта многими путями (через ссылки). И ВСЕ эти пути будут правильным именем объекта. При этом сам объект может вообще не знать, что у него есть имя  smile 
Цитата

Цитата(xvr @  29.10.2009,  00:21 Найти цитируемый пост)
Рекомендую хранить Moniker'ы

Решение понятно, непонятна идеология...
Идеология очень простая - объекты ничего не знают ни об их имени в частности, ни о моникерах вообще.

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


Эксперт
***


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

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



Цитата(xvr @  29.10.2009,  13:06 Найти цитируемый пост)
И ВСЕ эти пути будут правильным именем объекта. При этом сам объект может вообще не знать, что у него есть имя.

Ну так я не против. Пусть имён будет много и пусть объект их не знает. Но кто-то же должен знать его имена, если они у него есть? У кого спросить?

В файловой системе имя является идентификатором. Поэтому, когда я обращаюсь к файлу, я неизбежно делаю это по имени и потому в библиотеке можно и не делать функции определении имени. Имя это аргумент, первичный ключ. А вот, например, размер файла -- это просто его свойство. И в библиотеке есть функция для его получения - _filelength.

В DS имя не играет роли первичного ключа. Я нахожу объекты по типам и интерфейсам. Поэтому, было бы логично дать возможность мне узнать это имя.

Это сообщение отредактировал(а) Dims - 29.10.2009, 14:31
PM MAIL   Вверх
xvr
Дата 29.10.2009, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Dims @ 29.10.2009,  14:29)
Цитата(xvr @  29.10.2009,  13:06 Найти цитируемый пост)
И ВСЕ эти пути будут правильным именем объекта. При этом сам объект может вообще не знать, что у него есть имя.

Ну так я не против. Пусть имён будет много и пусть объект их не знает. Но кто-то же должен знать его имена, если они у него есть? У кого спросить?

У моникера
Цитата

В файловой системе имя является идентификатором. Поэтому, когда я обращаюсь к файлу, я неизбежно делаю это по имени и потому в библиотеке можно и не делать функции определении имени. 
Неа. Открытый файл в библиотеке представляется некоторым числом - handle'ом. В частности стандартные потоки ввода вывода имеют стандартные handle'ы 0, 1 и 2. И из этого числа получить имя файла уже невозможно. Например, мы запускаем программу так
Код

my_prog <inp.file.txt >out.file.txt
Она получит 2 открытых файла inp.file.txt и out.file.txt в виде handle'ов 0 и 1, но она не сможет НИКАКИМ образом узнать их имена

В COM путь к файлу соотвествует моникеру, а экземпляр IUnknown соотвествует handle'у файла

Цитата

Имя это аргумент, первичный ключ. А вот, например, размер файла -- это просто его свойство. И в библиотеке есть функция для его получения - _filelength.
Но нет функции для получения имени, ибо оно не является свойством файла. Могут быть файлы и без имени, например тут
Код

my_prog | sort | more
Тут таких файлов целых 2 (2 пайпа между my_prog и sort и между sort и more)

Цитата

В DS имя не играет роли первичного ключа. Я нахожу объекты по типам и интерфейсам. Поэтому, было бы логично дать возможность мне узнать это имя.
Оно дает - IBaseFilter::QueryFilterInfo -> FILTER_INFO::achName
Но так как оно нафиг никому (в программе) не нужно, то оно имеет право быть пустым  smile 
PM MAIL   Вверх
Dims
Дата 29.10.2009, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(xvr @  29.10.2009,  18:15 Найти цитируемый пост)
У моникера

Моникера нет.

Цитата(xvr @  29.10.2009,  18:15 Найти цитируемый пост)
В частности стандартные потоки ввода вывода имеют стандартные handle'ы 0, 1 и 2. И из этого числа получить имя файла уже невозможно.

Совершенно верно! Это ещё одна из причин, почему нельзя получить имя по хендлу -- потому что хендл может обозначать не только файл, но и поток другой природы, у которого имени нет.

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


Эксперт
****


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

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



Цитата(Dims @ 29.10.2009,  19:09)
Цитата(xvr @  29.10.2009,  18:15 Найти цитируемый пост)
В частности стандартные потоки ввода вывода имеют стандартные handle'ы 0, 1 и 2. И из этого числа получить имя файла уже невозможно.

Совершенно верно! Это ещё одна из причин, почему нельзя получить имя по хендлу -- потому что хендл может обозначать не только файл, но и поток другой природы, у которого имени нет.

IUnknown это тоже объект 'другой природы'. У него тоже может не быть имени.

Цитата

А может ли быть в DS объект, который где-то когда-то не может быть получен через моникер?
Ну наверное сам GraphBuilder  smile Может и еще кто то, не копал в эту сторону (за ненадобностью)  smile 

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


 




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


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

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