Учитывая экземпляр элемента управления ActiveX, как мне перечислить его интерфейсы? (Хотелось бы получить названия интерфейсов).
Как найти интерфейсы элемента ActiveX?
Ответы (3)
Как уже упоминалось другими, единственный способ - это QueryInterface для всех возможных интерфейсов. И это именно то, что делает за вас инструмент Microsoft OleView.
К сожалению, COM не предназначен для этого. На базовом уровне COM вы можете просто спросить объект, он поддерживает определенный интерфейс с идентификатором UUID, по одному. Поскольку существует множество потенциальных UUID, получение таким образом исчерпывающего списка займет довольно много времени! Хотя большинство реализаций объектов отслеживают список поддерживаемых интерфейсов внутри, не существует стандартного способа COM для доступа к этим спискам извне. И даже если бы они были, вы могли бы получить программное имя интерфейса, только просмотрев их UUID в реестре, что не всегда надежно.
Объекты ActiveX (сложный термин!) обычно поддерживают автоматизацию с помощью IDispatch. Если объекты хорошо себя ведут, вы сможете получить некоторую информацию о методах они поддерживают через GetTypeInfo(). Это не будет включать имена интерфейсов (если есть), которым принадлежат методы.
Подводя итог, COM довольно плохо справляется с метаданными объекта.
Ни за что. Идея, лежащая в основе интерфейсов COM, заключается в том, что вы спрашиваете объект - «пожалуйста, дайте мне интерфейс XYZ, если вы его поддерживаете), и объект решает, как реагировать - предоставить ссылку на себя или открыть интерфейс какого-либо внутреннего объекта и т. Д. Так что вы можете» Чтобы знать, какие интерфейсы объект «поддерживает», не спрашивая объект, как описано выше, это было дизайнерским решением разработчиков COM.