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

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

04.04.2013, 15:09. Показов 2740. Ответов 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,701
04.04.2013, 15:40  [ТС]
Для порядку. Есть интерфейс такой-то, надо узнать какой компонент его реализует. Или что, самому писать реализацию методов? Так может вообще всё самому написать? Все функции, все программы...?
Вот это и будет ад.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
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,701
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
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
04.04.2013, 16:27
Цитата Сообщение от kravam Посмотреть сообщение
как интерфейсом-то воспользоваться
создается объект передавая системе CLSID (вы ведь знаете что установили на компьютер?), от объекта получают нужный интерфейс передавая ему IID (вы ведь знаете при помощи какого интерфейса собираетесь обращаться к объекту?). лазать по реестру не нужно совершенно.
Цитата Сообщение от kravam Посмотреть сообщение
Где там имя компонента
его там не будет. поднимите еще раз архивы с моделью COM которые я вам в одной из соседних тем указал и поглядите как он регистрируется. ссылка на файл будет только в ветке CLSID. интерфейсы на то и интерфейсы что они не привязаны к реализации. если очень хочется можно перебирать все объекты (как мягкий вариант - все библиотеки типов) и выуживать из них интерфейсы.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,701
04.04.2013, 16:53  [ТС]
Цитата Сообщение от vxg Посмотреть сообщение
вы ведь знаете что установили на компьютер?
А разве не существует такого понятия как стандартный интерфейс?

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

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

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

Ну ладно.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
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
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru