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

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

04.04.2013, 15:09. Показов 2897. Ответов 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 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
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 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
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 / 2181 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
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
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru