Зная, какие интерфейсы запрашивать в COM-объекте - PullRequest
1 голос
/ 06 июня 2019

Я искал пример кода Раймонда Чена, доступный здесь .Насколько я понимаю, он получает элемент оболочки, используя интерфейс IShellWindows.Затем, используя интерфейс IDispatch этого элемента и вызов QueryInterface, он переключается на интерфейс IWebBrowserApp элемента.А затем, несколькими строками позже, кажется, что он переключается на интерфейс элемента IServiceProvider.Мой вопрос, прежде чем использовать QueryInterface, как вы узнаете, что элемент IShellWindows может поддерживать интерфейсы IWebBrowserApp и IServiceProvider?Например, я не вижу никакой документации, в которой перечислены все интерфейсы, которые поддерживает элемент IShellWindows.

1 Ответ

2 голосов
/ 06 июня 2019

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

Давайте попробуем разобрать ваш конкретный пример.

У объекта, который реализует IShellWindows (CLSID_ShellWindows), на самом деле нет никаких других интересных интерфейсов, вы просто заботитесь о его списке окон.

IShellWindows -> (IDispatch ->) IWebBrowserApp:

IShellWindows имеет коллекцию открытых окон Internet Explorer и Explorer.По какой-то причине он просто дает вам IDispatch для каждого окна вместо того, чтобы запрашивать конкретный интерфейс.Возможно, только потому, что IShellWindows также поддерживает сценарии Windows Scripting Host / Visual Basic и IDispatch играет там большую роль.

Коллекция Windows Shell включает в себя окна проводника файлов и окна веб-браузера InternetПроводник и сторонние веб-браузеры).Обычно каждое окно оболочки реализует IDispatch;IShellWindows :: Item и IShellWindows :: FindWindowSW предоставляют способы доступа к интерфейсу IDispatch окна оболочки.

.. и соединение между IShellWindows и IWebBrowserApp / IWebBrowser2:

exdisp.h содержит следующие программные интерфейсы

  • IShellWindows
  • IWebBrowser2

IWebBrowserApp -> IShellBrowser:

Объекты, имеющие доступ к цепочке сайтов браузера, могут получить ссылку на браузер в IShellBrowser, используя IServiceProvider :: QueryService , с идентификаторами служб, такими как SID_STopLevelBrowser и SID_SCommDlgBrowser.См. Статью в базе знаний. Извлечение интерфейса IWebBrowser2 верхнего уровня из элемента управления ActiveX для получения дополнительной информации об использовании идентификаторов служб.

Тот факт, что веб-браузер и оболочка связаны следующим образомэто не должно удивлять людей, которые интересовались Windows в течение периода времени Windows 98 / IE 4.Internet Explorer и File Explorer были в основном одним и тем же;Explorer может отображать веб-страницы, а IE может отображать «список файлов» (IShellView).

IShellBrowser -> IShellView:

всего лишь простой вызов QueryActiveShellView.

Здесь есть ключевой момент;IShellFolder / IShellView может быть реализован сторонним расширением оболочки.Проводник реализует IShellBrowser, и именно IShellBrowser размещает IShellView, а сторонние независимые поставщики ПО также могут создавать файловые браузеры, которые реализуют IShellBrowser.Теоретически у вас может быть приложение для просмотра файлов, созданное одной компанией, в которой размещено представление оболочки, созданное другой компанией без участия кода Microsoft.IShellBrowser и IShellView - это то, как они видят друг друга.

IShellView -> IFolderView:

Прямого соединения здесь нет, но если вы посмотрите вокруг, вы можете соединить точки.

IShellFolderView поддерживается объектом IShellView, который возвращается из SHCreateShellFolderViewEx

[IShellFolderView больше не доступен для использования в Windows 7. Вместо этого используйте IFolderView2 и IFolderView.]

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

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