Форум программистов, компьютерный форум, киберфорум
C/C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/13: Рейтинг темы: голосов - 13, средняя оценка - 4.85
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705

Узнать имя компонента, реализующего интерфейс и имя категории, в которую этот интерфейс входит

04.04.2013, 15:09. Показов 2813. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Темы очень близки. Поэтому два в одном решил сделать.

Вот я взял у Роджерсона код:

C++
1
2
3
4
5
    HRESULT hr = ::CoCreateInstance(CLSID_StdComponentCategoriesMgr,
                                    NULL, 
                                    CLSCTX_ALL,
                                    IID_ICatInformation, 
                                    (void**)&g_pICatInformation) ;
Теперь представим себе, что я знаю интерфейс ICatInformation, надо найти компонент, который его реализует. Например, CLSID_StdComponentCategoriesMgr. Таких компонентов по (теории если), может быть несколько, но мне хоть бы один найти.

Ну то есть такой вот пока вопрос:
Как узнать к какой категории(ям) принадлежит интерфейс?

Зная это я может быть, по OleView найду компонент, который к этой категории принадлежит. А может не найду.

++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++

Можно ли всё это сделать программно? У меня не плучилось, тем более что вот у Роджерсона:

ICatInformation применяется для получения информации о категориях в системе. С
помощью этого интерфейса Вы можете найти:
! все категории, зарегистрированные в системе;
! все компоненты, принадлежащие данной категории;
! все категории, к которым принадлежит данный компонент.
А мне нужно все категории, к которым принадлежит данный интерфейс. Такого пункта нет. Ковырялся с IEnumCATEGORYINFO, тоже бесполезно.

Не по теме:

По идее, ICatInformation должен быть инструментом, а подопытным кроликом какой-нибудь другой интерфейс, например, ICatRegister. А то получается, ICatInformation сам и ищет в какие категории сам же и входит. Ну пусть так. Если кому проще пусть представит, что мы ищем, категории, к которым принадлежит ICatRegister


Чтобы два раза не вставать, будем разбирать оба способа: с помощью OleView и программный. Спасибо, кто откликнется.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.04.2013, 15:09
Ответы с готовыми решениями:

Как узнать имя таблицы на которую установлен курсор
Есть БД состоящая из нескольких таблиц. Как узнать на какую конкретно таблицу установлен курсор. Нужен метод обратный ...

UnitTests, проверка экземпляра класса, реализующего интерфейс
День добрый, форумчане. Осваиваю тестирование, пробую, пишу код. Возник следующий вопрос: допустим, некоторый метод принимает на...

Как узнать имя нового созданого компонента
Как узнать имя нового созданого компонента? Вот в етой процедуре при нажатии кнопи я создаю новою вкладку и во вкладке DBGrid, как...

7
04.04.2013, 15:30

Не по теме:

зачем весь этот ад?

0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
04.04.2013, 15:40  [ТС]
Для порядку. Есть интерфейс такой-то, надо узнать какой компонент его реализует. Или что, самому писать реализацию методов? Так может вообще всё самому написать? Все функции, все программы...?
Вот это и будет ад.
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,456
04.04.2013, 16:08
в ветке CLSID лежат class id объектов внутри которых есть ветка Implemented Categories внутри которой есть id категорий в которые входит этот объект. и не факт, что человек задумывался над присвоением категории своему объекту.

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

Добавлено через 2 минуты
Цитата Сообщение от kravam Посмотреть сообщение
надо узнать какой компонент его реализует
его может реализовывать тьма компонентов. какой вам от этого выхлоп? условно говоря: есть интерфейс OPC DA. на машине стоят 10 OPC DA серверов. каждый из них реализует этот интерфейс. но это не значит, что вам не нужно будет реализовать его с нуля если поставлена задача написать свой OPC DA сервер.

Добавлено через 1 минуту
это лишь интерфейс. определяющим является объект. если вас устраивает объект и у него есть интерфейс - используйте его. для этого не нужно рыскать по категориям

Добавлено через 15 минут
...если мысленно представить задачу простого просмотра, то наверное придется просто открывать все библиотеки типов, запрашивать у них информацию об интерфейсах и объектах, искать эти объекты и категории в которые они входят... а библиотеки типов может и не быть.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
04.04.2013, 16:20  [ТС]
Вы не поняли. Я всё сделал так, как вы сказали. Но я таким образом могу получить id категорий, к которым принадлежит некоторый CLSID, правильно? А мне нужно id категорий, к которым принадлежит не компонет (ибо CLSID идентификатор компонента), а интерфейс!

Цитата Сообщение от vxg Посмотреть сообщение
и не факт, что человек задумывался над присвоением категории своему объекту.
Ну то есть я так понял, интерфейс вообще может быть не категоризирован. А тогда вообще задача одноходовая- как узнать CLSID компонента (ов) которые реализуют такой-то интерфейс? Иначе как интерфейсом-то воспользоваться? От того, что он лежит мёртвым грузом, мне ни жарко , ни холодно.

Итак, имеем интерфейс ICatInformation
Лезем в ComCat.h (ну а что делать?)? ищем идентификатор, вот он:
C++
1
0002E013-0000-0000-C000-000000000046
В ветке
HKEY_CLASSES_ROOT\Interface\ ищем раздел с таким именам, нашли. Максимум инфы, которую я могу оттуда почерпнуть, это количество методов NumMethods и какая-то фигня называющаяся ProxyStubClsid32 с GUID-ом, естессно. Где там имя компонента (CLSID_StdComponentCategoriesMgr) ума не приложу. А найти это имя надо.
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,456
04.04.2013, 16:27
Цитата Сообщение от kravam Посмотреть сообщение
как интерфейсом-то воспользоваться
создается объект передавая системе CLSID (вы ведь знаете что установили на компьютер?), от объекта получают нужный интерфейс передавая ему IID (вы ведь знаете при помощи какого интерфейса собираетесь обращаться к объекту?). лазать по реестру не нужно совершенно.
Цитата Сообщение от kravam Посмотреть сообщение
Где там имя компонента
его там не будет. поднимите еще раз архивы с моделью COM которые я вам в одной из соседних тем указал и поглядите как он регистрируется. ссылка на файл будет только в ветке CLSID. интерфейсы на то и интерфейсы что они не привязаны к реализации. если очень хочется можно перебирать все объекты (как мягкий вариант - все библиотеки типов) и выуживать из них интерфейсы.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
04.04.2013, 16:53  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
вы ведь знаете что установили на компьютер?
А разве не существует такого понятия как стандартный интерфейс?

Я когда устанавливал ось, я понятия не имел, что у меня там находятся dll, а в них функции. А узнал об этом из MSDN. То есть мне сказали: у тебя есть такая-то dll, а ней функция такая-то, пользуйся. И хидер ещё написали.

Ну пусть подобная инфа будет не у меня в системе а в том же MSDN? так ведь нет!
http://msdn.microsoft.com/en-u... 85%29.aspx

По-моему, если и есть стандартные интерфейсы на свете, то ICatInformation один из них. Должен к нему прицепом идти какая-нибудь стандартная реализация? Да (CLSID_StdComponentCategoriesMgr). Обязан я её знать? Не, ну если вставать на ту позицию, что я должен знать о своей системе ВСЁ, тогда да, я должен знать как называется стандартный компонент, реализующий стандартный интерфейс. Об этом нигде не написано (и в самой оси даже нигде об этом не написано, реестр тому пример), но знать я должен потому, что я ось установил.

Ну ладно.
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,456
05.04.2013, 11:16
Цитата Сообщение от kravam Посмотреть сообщение
А разве не существует такого понятия как стандартный интерфейс?
это вы к чему? существует великое множество интерфейсов. каждый из них уникален (имеется ввиду, что они не пересекаются). если разработчик хочет сделать какой-нибудь COM-объект и он видит, что общение с этим объектом может быть сведено к уже известному интерфейсу (например, IUnknown ) он берет и реализует этот интерфейс в своем объекте ни о чем не думая. в противном случае он пишет свой интерфейс (IDL файл; по хорошему, еще пишется h-файл, так как не все инструменты разработки могут извлечь достаточную для включения объекта в проект информацию из библиотеки типов; некоторые инструменты для генерации библиотек типов могут так же генерировать h-файл) и генерирует к нему библиотеку типов (если нужно обращение через IDispatch или вызов из другого процесса). потом пишет свой объект реализующий этот интерфейс. вместе с объектом разработчик распространяет библиотеку типов регистрируя ее в системе при регистрации объекта. информация о библиотеке типов ассоциированной с интерфейсом попадает в реестр в ветку HKEY_CLASSES_ROOT\Interface\<IID>\TypeLi b. при запуске объекта разработчик загружает библиотеку типов и получает из нее указатель на интерфейс ITypeInfo который использует при обработке обращения к функциям своего интерфейса через IDispatch. при вызовах из другого процесса информация, необходимая для упаковки/распаковки параметров, извлекается ОС из библиотеки типов. так же как ОС в этом случае занимается и собственно упаковкой/распаковкой параметров.
Цитата Сообщение от kravam Посмотреть сообщение
Я когда устанавливал ось, я понятия не имел, что у меня там находятся dll, а в них функции.
это вы к чему? если бы вы были разработчиком использующим те или иные возможности системы вы бы об этом знали. а так - много чего мы не знаем, знания из воздуха не возникают.
Цитата Сообщение от kravam Посмотреть сообщение
По-моему, если и есть стандартные интерфейсы на свете, то ICatInformation один из них. Должен к нему прицепом идти какая-нибудь стандартная реализация? Да (CLSID_StdComponentCategoriesMgr). Обязан я её знать? Не, ну если вставать на ту позицию, что я должен знать о своей системе ВСЁ, тогда да, я должен знать как называется стандартный компонент, реализующий стандартный интерфейс. Об этом нигде не написано (и в самой оси даже нигде об этом не написано, реестр тому пример), но знать я должен потому, что я ось установил.
вообще не понял. есть некоторые системные COM-объекты (объекты уже установленные в вашу версию системы; во всяком случае, если вы не делаете "репак" дистрибутива; и то, не факт, что "неугодные" объекты вам удастся выбросить из коробки по причине того, что от них может зависеть "фундамент" системы) реализующие некоторые интерфейсы. CLSID_StdComponentCategoriesMgr - один из таких объектов реализующих, например, IID_ICatInformation. и знает об этом каждый разработчик "роющий" указанную тематику. вообще, никто не запрещает вам создать свой объект (со своим CLSID) реализующий интерфейс IID_ICatInformation и пользоваться им. только нужно будет таскать его с программой его использующей.
----
вот, например, задача похожая на то, что вы, вроде бы, хотите.
есть те же самые OPC DA сервера. пользователь должен иметь возможность просмотра списка установленных серверов (например, в SCADA хочет выбрать откуда получать данные). сделать это можно 1001 способом. вот некоторые из них:
-поиск в реестре по ключевому слову "OPC" - адский низкоуровневый способ
-поиск в реестре по категории "OPC DA2" - через наш любимый IID_ICatInformation
-перечисление серверов при помощи специально придуманного для этого интерфейса IOPCServerList2 реализуемого объектом CLSID_OpcServerList (который поставляется с OPC core и живет в opcenum.exe).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.04.2013, 11:16
Помогаю со студенческими работами здесь

Как узнать имя компонента по его тегу?
У меня есть тег компонента, но нет его имени. Как его узнать по тегу?

Как узнать имя компонента в котором было вызвано PopupMenu?
Подскажите как узнать имя компонента в котором было вызвано PopupMenu Добавлено через 9 минут PopupComponent спс всем

Как узнать имя компонента над которым находиться курсор
Доброго всем времени суток!!! Подскажите пожалуйста, способы определения имени компонента находящегося под курсором. Имеются 2...

Создать интерфейс IPerson (человек), включающий в себя свойства: Name (имя), BirthDate (дата рождения) и метод PrintInfo
Создать интерфейс IPerson (человек), включающий в себя свойства: Name (имя), BirthDate (дата рождения) и метод PrintInfo(). Создать 2...

Как узнать полное имя файла зная его краткое имя?
например при запуске программы достаточно написать &quot;Excel&quot; или &quot;Calc&quot; при этом система уже в курсе где этот файл лежит. как программно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru