*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". Как получить по раздельности все остальные ветки? |
В общем так (результаты исследований):
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-