быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
|
||||||
1 | ||||||
Узнать имя компонента, реализующего интерфейс и имя категории, в которую этот интерфейс входит04.04.2013, 15:09. Показов 2413. Ответов 7
Метки нет (Все метки)
Темы очень близки. Поэтому два в одном решил сделать.
Вот я взял у Роджерсона код:
Ну то есть такой вот пока вопрос: Как узнать к какой категории(ям) принадлежит интерфейс? Зная это я может быть, по OleView найду компонент, который к этой категории принадлежит. А может не найду. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Можно ли всё это сделать программно? У меня не плучилось, тем более что вот у Роджерсона: Не по теме: По идее, ICatInformation должен быть инструментом, а подопытным кроликом какой-нибудь другой интерфейс, например, ICatRegister. А то получается, ICatInformation сам и ищет в какие категории сам же и входит. Ну пусть так. Если кому проще пусть представит, что мы ищем, категории, к которым принадлежит ICatRegister Чтобы два раза не вставать, будем разбирать оба способа: с помощью OleView и программный. Спасибо, кто откликнется.
0
|
04.04.2013, 15:09 | |
Ответы с готовыми решениями:
7
Как узнать имя таблицы на которую установлен курсор UnitTests, проверка экземпляра класса, реализующего интерфейс Как узнать имя нового созданого компонента Как узнать имя компонента по его тегу? |
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 минуты его может реализовывать тьма компонентов. какой вам от этого выхлоп? условно говоря: есть интерфейс 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 идентификатор компонента), а интерфейс!
Ну то есть я так понял, интерфейс вообще может быть не категоризирован. А тогда вообще задача одноходовая- как узнать CLSID компонента (ов) которые реализуют такой-то интерфейс? Иначе как интерфейсом-то воспользоваться? От того, что он лежит мёртвым грузом, мне ни жарко , ни холодно. Итак, имеем интерфейс ICatInformation Лезем в ComCat.h (ну а что делать?)? ищем идентификатор, вот он:
HKEY_CLASSES_ROOT\Interface\ ищем раздел с таким именам, нашли. Максимум инфы, которую я могу оттуда почерпнуть, это количество методов NumMethods и какая-то фигня называющаяся ProxyStubClsid32 с GUID-ом, естессно. Где там имя компонента (CLSID_StdComponentCategoriesMgr) ума не приложу. А найти это имя надо.
0
|
Модератор
3401 / 2172 / 353
Регистрация: 13.01.2012
Сообщений: 8,424
|
|
04.04.2013, 16:27 | 6 |
создается объект передавая системе CLSID (вы ведь знаете что установили на компьютер?), от объекта получают нужный интерфейс передавая ему IID (вы ведь знаете при помощи какого интерфейса собираетесь обращаться к объекту?). лазать по реестру не нужно совершенно.
его там не будет. поднимите еще раз архивы с моделью COM которые я вам в одной из соседних тем указал и поглядите как он регистрируется. ссылка на файл будет только в ветке CLSID. интерфейсы на то и интерфейсы что они не привязаны к реализации. если очень хочется можно перебирать все объекты (как мягкий вариант - все библиотеки типов) и выуживать из них интерфейсы.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
|
|
04.04.2013, 16:53 [ТС] | 7 |
А разве не существует такого понятия как стандартный интерфейс?
Я когда устанавливал ось, я понятия не имел, что у меня там находятся 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 |
это вы к чему? существует великое множество интерфейсов. каждый из них уникален (имеется ввиду, что они не пересекаются). если разработчик хочет сделать какой-нибудь COM-объект и он видит, что общение с этим объектом может быть сведено к уже известному интерфейсу (например, IUnknown ) он берет и реализует этот интерфейс в своем объекте ни о чем не думая. в противном случае он пишет свой интерфейс (IDL файл; по хорошему, еще пишется h-файл, так как не все инструменты разработки могут извлечь достаточную для включения объекта в проект информацию из библиотеки типов; некоторые инструменты для генерации библиотек типов могут так же генерировать h-файл) и генерирует к нему библиотеку типов (если нужно обращение через IDispatch или вызов из другого процесса). потом пишет свой объект реализующий этот интерфейс. вместе с объектом разработчик распространяет библиотеку типов регистрируя ее в системе при регистрации объекта. информация о библиотеке типов ассоциированной с интерфейсом попадает в реестр в ветку HKEY_CLASSES_ROOT\Interface\<IID>\TypeLib. при запуске объекта разработчик загружает библиотеку типов и получает из нее указатель на интерфейс ITypeInfo который использует при обработке обращения к функциям своего интерфейса через IDispatch. при вызовах из другого процесса информация, необходимая для упаковки/распаковки параметров, извлекается ОС из библиотеки типов. так же как ОС в этом случае занимается и собственно упаковкой/распаковкой параметров.
это вы к чему? если бы вы были разработчиком использующим те или иные возможности системы вы бы об этом знали. а так - много чего мы не знаем, знания из воздуха не возникают. вообще не понял. есть некоторые системные 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 | |
05.04.2013, 11:16 | |
Помогаю со студенческими работами здесь
8
Как узнать имя компонента в котором было вызвано PopupMenu? Как узнать имя компонента над которым находиться курсор Создать интерфейс IPerson (человек), включающий в себя свойства: Name (имя), BirthDate (дата рождения) и метод PrintInfo Как узнать полное имя файла зная его краткое имя? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Опции темы | |
|
Новые блоги и статьи | |||||
Как получить индекс в цикле 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 представляют собой один из фундаментальных типов данных, который позволяет хранить упорядоченные коллекции различных элементов в одной переменной. Эта структура данных является. . .
|