Как найти интерфейсы элемента управления ActiveX? - PullRequest
5 голосов
/ 23 августа 2010

Учитывая экземпляр элемента управления ActiveX, как мне перечислить его интерфейсы? (Я хотел бы получить имена интерфейсов).

Ответы [ 3 ]

4 голосов
/ 23 августа 2010

Как уже упоминалось, единственным способом является использование QueryInterface для всех возможных интерфейсов. И это именно то, что инструмент Microsoft OleView делает для вас.

3 голосов
/ 23 августа 2010

К сожалению, это не то, для чего предназначен COM.На базовом уровне COM вы можете просто спросить объект, поддерживает ли он определенный интерфейс, идентифицированный UUID, по одному за раз.Поскольку существует множество потенциальных UUID, получение такого исчерпывающего списка займет довольно много времени!Хотя большинство реализаций объектов отслеживают список поддерживаемых интерфейсов внутри, стандартного COM-способа доступа к этим спискам извне не существует.И даже если бы они были, вы могли бы получить только программное имя интерфейса, посмотрев их UUID в реестре, что не всегда надежно.

Объекты ActiveX (хитрый термин!) , как правило, поддерживают автоматизацию через IDispatch.Если объекты хорошо себя ведут, вы сможете получить некоторую информацию о методах , которые они поддерживают, через GetTypeInfo().Это не будет включать имена интерфейсов (если таковые имеются), к которым принадлежат методы.

Подводя итог, можно сказать, что COM довольно слаб в метаданных объекта.

1 голос
/ 23 августа 2010

Ни за что. Идея COM-интерфейсов заключается в том, что вы спрашиваете у объекта: «Пожалуйста, дайте мне интерфейс XYZ, если вы поддерживаете его), и объект решает, как реагировать - предоставьте ссылку на себя или предоставьте интерфейс некоторого внутреннего объекта и т. Д. t знать, какие интерфейсы «поддерживает» объект, не спрашивая объект, как описано выше. Это было дизайнерское решение COM-дизайнеров.

...