быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
1

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

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

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

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

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, проверка экземпляра класса, реализующего интерфейс
День добрый, форумчане. Осваиваю тестирование, пробую, пишу код. Возник следующий вопрос:...

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

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

7
vxg
04.04.2013, 15:30
  #2

Не по теме:

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

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

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

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

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

Добавлено через 15 минут
...если мысленно представить задачу простого просмотра, то наверное придется просто открывать все библиотеки типов, запрашивать у них информацию об интерфейсах и объектах, искать эти объекты и категории в которые они входят... а библиотеки типов может и не быть.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
04.04.2013, 16:20  [ТС] 5
Вы не поняли. Я всё сделал так, как вы сказали. Но я таким образом могу получить 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
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,424
04.04.2013, 16:27 6
Цитата Сообщение от kravam Посмотреть сообщение
как интерфейсом-то воспользоваться
создается объект передавая системе CLSID (вы ведь знаете что установили на компьютер?), от объекта получают нужный интерфейс передавая ему IID (вы ведь знаете при помощи какого интерфейса собираетесь обращаться к объекту?). лазать по реестру не нужно совершенно.
Цитата Сообщение от kravam Посмотреть сообщение
Где там имя компонента
его там не будет. поднимите еще раз архивы с моделью COM которые я вам в одной из соседних тем указал и поглядите как он регистрируется. ссылка на файл будет только в ветке CLSID. интерфейсы на то и интерфейсы что они не привязаны к реализации. если очень хочется можно перебирать все объекты (как мягкий вариант - все библиотеки типов) и выуживать из них интерфейсы.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
04.04.2013, 16:53  [ТС] 7
Цитата Сообщение от vxg Посмотреть сообщение
вы ведь знаете что установили на компьютер?
А разве не существует такого понятия как стандартный интерфейс?

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

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

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

Ну ладно.
0
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,424
05.04.2013, 11:16 8
Цитата Сообщение от kravam Посмотреть сообщение
А разве не существует такого понятия как стандартный интерфейс?
это вы к чему? существует великое множество интерфейсов. каждый из них уникален (имеется ввиду, что они не пересекаются). если разработчик хочет сделать какой-нибудь COM-объект и он видит, что общение с этим объектом может быть сведено к уже известному интерфейсу (например, IUnknown ) он берет и реализует этот интерфейс в своем объекте ни о чем не думая. в противном случае он пишет свой интерфейс (IDL файл; по хорошему, еще пишется h-файл, так как не все инструменты разработки могут извлечь достаточную для включения объекта в проект информацию из библиотеки типов; некоторые инструменты для генерации библиотек типов могут так же генерировать h-файл) и генерирует к нему библиотеку типов (если нужно обращение через IDispatch или вызов из другого процесса). потом пишет свой объект реализующий этот интерфейс. вместе с объектом разработчик распространяет библиотеку типов регистрируя ее в системе при регистрации объекта. информация о библиотеке типов ассоциированной с интерфейсом попадает в реестр в ветку HKEY_CLASSES_ROOT\Interface\<IID>\TypeLib. при запуске объекта разработчик загружает библиотеку типов и получает из нее указатель на интерфейс 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
05.04.2013, 11:16
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.04.2013, 11:16
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

Новые блоги и статьи
Как получить индекс в цикле for в Python
bytestream 21.01.2025
При работе с коллекциями данных в Python часто возникает необходимость не только получить доступ к элементам последовательности, но и знать их позицию в процессе итерации. Индексация в циклах. . .
Как определить адрес, из которого локальный репозиторий Git был клонирован
bytestream 21.01.2025
В современной разработке программного обеспечения система контроля версий Git стала неотъемлемой частью рабочего процесса. При работе с Git разработчики часто сталкиваются с необходимостью. . .
Какая разница между операторами == и === в сравнениях в JavaScript
bytestream 21.01.2025
В мире веб-разработки JavaScript занимает особое место как динамический язык программирования, предоставляющий разработчикам широкий набор инструментов для создания интерактивных веб-приложений. . . .
Из чего и как собрать свой домашний кинотеатр
bt_guru 21.01.2025
Создание домашнего кинотеатра: от идеи до реализации В современном мире домашний кинотеатр стал неотъемлемой частью комфортного жилого пространства, предоставляя возможность наслаждаться. . .
Ошибки стиральных машин
bt_guru 21.01.2025
Современные стиральные машины представляют собой сложные электронные устройства, оснащенные множеством датчиков и систем контроля. Они способны самостоятельно определять вес загруженного белья,. . .
Копирование (маппинг) объектов в JavaScript
bytestream 21.01.2025
В современной разработке программного обеспечения копирование объектов представляет собой фундаментальную операцию, которая требует особого внимания и понимания. Маппинг объектов в JavaScript – это. . .
Как работать с Apache Kafka в C# .NET
bytestream 21.01.2025
Apache Kafka представляет собой распределенную платформу потоковой передачи данных, которая произвела революцию в области обработки больших объемов информации в реальном времени. Эта система,. . .
Как использовать RabbitMQ в C# .NET
bytestream 21.01.2025
RabbitMQ представляет собой мощный брокер сообщений, который эффективно решает эту задачу, обеспечивая надежную передачу данных между множеством приложений. Этот инструмент реализует протокол AMQP. . .
Как объединить последние коммиты в Git
bytestream 21.01.2025
В мире разработки программного обеспечения система контроля версий Git стала незаменимым инструментом для управления исходным кодом. Одной из наиболее полезных, но порой сложных для освоения функций. . .
Как запушить новую локальную ветку (branch) в удалённый репозиторий Git и отслеживать её
bytestream 21.01.2025
В современной разработке программного обеспечения система контроля версий Git стала неотъемлемым инструментом для эффективного управления кодом и организации командной работы. Одной из ключевых. . .
Как создать директорию и все родительские директории, указанные в пути, с помощью Python
bytestream 21.01.2025
Python предоставляет мощные инструменты для работы с файловой системой через встроенные модули os и pathlib, которые значительно упрощают процесс манипуляции директориями. Эти модули содержат. . .
Как работать с массивами в JavaScript
bytestream 21.01.2025
Массивы в JavaScript представляют собой один из фундаментальных типов данных, который позволяет хранить упорядоченные коллекции различных элементов в одной переменной. Эта структура данных является. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru