Как получить интерфейс COM с учетом HWND элемента управления ActiveX? - PullRequest
6 голосов
/ 05 апреля 2011

Я пытаюсь написать небольшую C (C ++ тоже хорошо) утилиту для шпионажа элементов управления ActiveX.Учитывая некоторый HWND-дескриптор окна, я хотел бы напечатать

  1. , какие свойства и какие методы доступны для элемента управления ActiveX для этого HWND
  2. , какие интерфейсы реализует элемент управления

В целях тестирования я встраиваю случайные элементы управления ActiveX (например, элемент управления Microsoft Slider) в тестовый контейнер элемента управления ActiveX , чтобы я знал, что HWND элемента управленияэто действительно окно элемента управления ActiveX.Кроме того, я знаю, какие свойства / методы предоставляет элемент управления, поэтому я могу протестировать свой инструмент.

Мое текущее решение для (1) - использовать функцию AccessibleObjectFromWindow на HWND, чтобы получить IDispatch .Это работает, но кажется, что вы всегда всегда получаете доступный интерфейс обратно (возвращаемый IDispatch - это просто часть IDispatch интерфейса IAccessible).Я попытался передать фактический CLSID моего образца элемента управления в качестве третьего аргумента AccessibleObjectFromWindow , но это тоже не помогло.Кажется, что функция действительно соответствует своему названию - вы всегда получаете только интерфейс специальных возможностей.: -)

Кто-нибудь знает, возможен ли вообще такой «шпион ActiveX»?Если да, то как?

Ответы [ 2 ]

1 голос
/ 04 июля 2013

Как отметил @sehe, не существует надежного способа обнаружения элементов управления извне, и можно сказать, что некоторые элементы управления ActiveX не имеют / не имеют окон без своих собственных HWND s.

Однако, если выХорошо, чтобы обнаружить хотя бы некоторые элементы управления, вы можете найти те, которые размещены в популярном классе ATL CAxHostWindow.Этот хост будет отвечать на определенные сообщения окна, позволяющие вам получить интерфейс хоста и управления:

  • WM_ATLGETHOST получает вас IUnknown управляющего хоста (сайта)
  • WM_ATLGETCONTROLполучает IUnknown самого элемента управления

Оба идентификатора сообщения могут быть получены с помощью RegisterWindowMessage API:

const UINT WM_ATLGETHOST = RegisterWindowMessage(_T("WM_ATLGETHOST"));
const UINT WM_ATLGETCONTROL = RegisterWindowMessage(_T("WM_ATLGETCONTROL"));

Имея на руках элементы управления IUnknown, на которых можно перейтис обнаружением интерфейсов и запросом свойств IDispatch, IProvideClassInfo и других интерфейсов.Однако вам необходимо сделать его контекстом процесса, в котором размещается элемент управления, что усложняет перечисление: вам нужно внедрить свой код в процесс, например, с помощью ловушки.

1 голос
/ 05 апреля 2011

Вы не

Если у вас есть доступ к реализации элемента управления activex (например, в ATL), вы можете использовать таблицу поиска, чтобы вернуться к элементу управления, владеющему HWND;Вы можете использовать это вместе с глобальной таблицей экземпляров 1004 *

...