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