Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - [решено] *COM* | Как узнать имя класса по GUID

Ответить
Настройки темы
Разное - [решено] *COM* | Как узнать имя класса по GUID
pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


Изменения
Автор: pva
Дата: 01-10-2009
Описание: продолжаем исследование
Доброе время суток! Подскажите, пожалуйста, как попросить COM выдать имя класса (строчку), соответствующее заданному CLSID? Строчка есть в реестре, но самому лезть в реестр очень не хочется. Подойдёт ли функция ProgIdFromCLSID?
пример:
GUID: {083863F1-70DE-11d0-BD40-00A0C911CE86}
название расположено в: HKEY_CLASSES_ROOT\CLSID\{083863F1-70DE-11d0-BD40-00A0C911CE86} - значение по умолчанию
имя класса: ActiveMovie Filter Class Manager

Как разобрать по составу моникер?
Есть моникер IMoniker* filter_path
IMoniker::GetCLSID даёт {4315d437-5b8c-11d0-bd3b-00a0c911ce86}
ProgIdFromCLSID(IMoniker::GetCLSID) даёт device.1
IMoniker::GetDisplayName даёт @device:sw:{083863F1-70DE-11D0-BD40-00A0C911CE86}\{9852A670-F845-491B-9BE6-EBD841B8A613}
IMoniker::Enum даёт NULL
я так понимаю, что это оставной моникер, корень которого "device.1". Как получить по раздельности все остальные ветки?

Отправлено: 13:02, 01-10-2009

 
pva pva вне форума Автор темы

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


В общем так (результаты исследований):
ProgIdFromCLSID даёт результат только для объектов ActiveX, не ниже. Попросить систему разобрать по составу моникеры устройств нельзя, но их IMoniker::GetDisplayName вполне поддаётся осмыслению вручную (выделяем элементы, разделённые символами ':', '\\', '#', '{'..'}'). Тем не менее, есть "родной" способ проследить путь до устройства, который можно показывать пользователю (на человеческом языке).

допустим у нас есть моникер устройства IMoniker.
1. Получаем GUID моникера функцией IMoniker::GetClassID - это класс "устройства" ("device.1")
2. Создаём перечислитель классов CLSID_SystemDeviceEnum с интерфейсом ICreateDevEnum
3. Получаем набор моникеров IEnumMoniker при помощи ICreateDevEnum::CreateClassEnumerator, указав полученный от моникера GUID
4. перебираем моникеры в наборе, получая из GUID и рекурсивно повторяем шаг 2 до тех пор, пока один из моникеров не совпадёт с исходным моникером. Проверить это можно функцией IMoniker::IsEqual

таким образом, получается что нужно строить всю структуру классов полностью, независимо от того, хочу я узнать информацию про один класс, или про все

Строчку на человеческом языке, соответсвующую классу можно получить через интерфейс IPropertyBag. Имя свойства целиком совпадает с ключом в реестре, в разделе описывающем этот класс. Работает только для объектов, полученных при помощи CreateClassEnumerator. Гарантируется как минимум "FriendlyName", но я обнаружил у себя раздел, судя по классиду, соответсвующий устройствам захвата видео, но не имеющий человеческих опознавательных строчек.
А, да, ещё не все свойства имеют тип "строчка".

Последний раз редактировалось pva, 03-10-2009 в 11:49. Причина: про имя забыл


Отправлено: 11:44, 03-10-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - [решено] *COM* | Как узнать имя класса по GUID

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Как узнать предыдущее имя компьютера? Dimon3232 Microsoft Windows 2000/XP 15 22-08-2012 16:11
Прочие БД - Как узнать имя пользователя в MS Access? st031 Программирование и базы данных 0 30-08-2009 18:24
Как узнать _полное_ имя пользователя? fantik Microsoft Windows NT/2000/2003 2 21-11-2006 18:13
Как узнать имя процесса по смещению Andre505 Программирование и базы данных 2 27-09-2003 13:55
Как узнать имя Домена Guest Microsoft Windows 95/98/Me (архив) 2 10-10-2002 16:24




 
Переход