Как я могу перечислить члены COM-объекта, такие как интерфейсы, свойства и методы? - PullRequest
1 голос
/ 11 июля 2009

Какой метод или интерфейс WinAPI я могу использовать для программного перечисления интерфейсов, свойств, методов (и параметров) COM-объекта?

Ответы [ 4 ]

5 голосов
/ 11 июля 2009

Вам нужно быть более конкретным. Есть два способа интерпретировать ваш вопрос.

Во-первых, у вас есть компонент COM *1003* (например, некоторая библиотека), и вы хотите программно перечислить интерфейсы / свойства / методы этого. Обычно (но не всегда) компоненты COM поставляются с библиотекой типов, которая содержит полную метаинформацию обо всем этом - она ​​либо встроена в COM .exe или .dll, либо представляет собой отдельный файл .tlb. В любом случае, если COM-компонент правильно зарегистрирован в системе (например, с помощью regsvr32), то COM предоставляет стандартный API для извлечения информации этого типа, сосредоточенный вокруг ITypeLib и ITypeInfo,

Другая интерпретация заключается в том, что вы получаете ссылку на конкретный COM объект , и вам нужно перечислить все методы / свойства для этого и / или вызвать их по вычисленному имени, например Java или C # отражение, или Delphi RTTI. Если это так, то это возможно только в том случае, если COM-объект реализует интерфейс IDispatch , который позволяет выполнять все вышеперечисленное.

0 голосов
/ 13 июля 2009

Вы можете получить все, что захотите, из реестра, однако это займет некоторое время, поскольку информация не упорядочена таким образом, чтобы предоставить вам нужную информацию без предварительного анализа большей ее части. Если вы загружаете утилиту OLEVIEW32 с SDK платформы Microsoft (доступна на MSDN), вы можете использовать ее для изучения интерфейсов COM, зарегистрированных на машине.

Основы COM работают через интерфейсы, зарегистрированные в реестре, в разделе HKEY CLASSES ROOT \ CLSID. Когда вы запрашиваете определенный com-объект, он обращается к одному из этих руководств, который, в свою очередь, просматривает раздел InprocServer32 под этим руководством, чтобы определить, какую DLL / EXE загрузить, и какую модель потоков использовать. Вы можете использовать эту информацию для построения карты направляющих, которые также разрешают одну и ту же DLL (это нужно для получения классов)

В HKEY CLASSES ROOT \ Interface - это ссылка на все интерфейсы, зарегистрированные в системе. Опять же, пришло время для поиска, так как большая часть этой информации - просто указатели на другой ключ или библиотеку типов. Однако, что здесь и полезно, это список GUID -> InterfaceName (свойство по умолчанию для каждого guid).

В HKEY CLASSES ROOT \ TypeLib - ссылка на все библиотеки типов, зарегистрированные в системе.

0 голосов
/ 11 июля 2009

Я предполагаю, что вы хотите получить список всех интерфейсов, которые будут успешно обработаны QueryInterface. Ответ в том, что в COM нет никакого способа сделать это. Сами некоторые интерфейсы предоставляют такую ​​функциональность, как IServiceProvider.

0 голосов
/ 11 июля 2009

Ну, на COM-объекты ссылаются через интерфейсы, которые являются непрозрачными абстракциями по дизайну. Вы не сможете добраться до базового объекта без какой-либо чёрной магии, которая будет работать, только если вы действительно хорошо разбираетесь в низкоуровневых деталях объектной модели Delphi и объект фактически был написан на Delphi.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...