Как найти интерфейсы элемента ActiveX?

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


person Tamás Szelei    schedule 23.08.2010    source источник


Ответы (3)


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

person Paul Mitchell    schedule 23.08.2010

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

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

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

person Pontus Gagge    schedule 23.08.2010
comment
Спасибо за очень подробный ответ. Однако я искал практическое решение, которое мне предоставил ответ Пола, поэтому я принял это вместо этого. - person Tamás Szelei; 23.08.2010

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

person Eugene Mayevski 'Callback    schedule 23.08.2010