Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   [решено] *COM* | Как узнать имя класса по GUID (http://forum.oszone.net/showthread.php?t=151991)

pva 01-10-2009 13:02 1231894

*COM* | Как узнать имя класса по GUID
 
Доброе время суток! Подскажите, пожалуйста, как попросить 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". Как получить по раздельности все остальные ветки?

pva 03-10-2009 11:44 1233333

В общем так (результаты исследований):
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", но я обнаружил у себя раздел, судя по классиду, соответсвующий устройствам захвата видео, но не имеющий человеческих опознавательных строчек.
А, да, ещё не все свойства имеют тип "строчка".


Время: 06:25.

Время: 06:25.
© OSzone.net 2001-