我正在查看Raymond Chen的代码示例,here提供。据我了解,他使用IShellWindows
界面获得了一个外壳项目。然后,使用该项目的IDispatch
界面和对QueryInterface
的调用,他跳到该项目的IWebBrowserApp
界面。然后过了几行,他似乎跳到了项目的IServiceProvider
界面。我的问题是,在使用QueryInterface
之前,您如何知道IShellWindows
项可能支持IWebBrowserApp
和IServiceProvider
接口?例如,我看不到任何文档列出IShellWindows
项目支持的所有接口。
答案 0 :(得分:2)
MSDN通常不会告诉您对象实现了哪些接口,但是如果环顾四周,您通常会发现一些文档和相关接口,您可以使用QI。为了明确起见,一个接口只是一个契约,多个对象可以实现一个特定的接口,因此您不能真正责怪Microsoft没有确定的列表。
让我们尝试分清您的具体示例。
实现IShellWindows(CLSID_ShellWindows)的对象实际上没有任何其他有趣的接口,您只需关心它的窗口列表即可。
IShellWindows->(IDispatch->)IWebBrowserApp:
IShellWindows具有打开的Internet Explorer和Explorer窗口的集合。无论出于何种原因,它只会为每个窗口提供一个IDispatch,而不是让您要求特定的界面。可能是因为IShellWindows也可以由Windows Scripting Host / Visual Basic编写脚本,而IDispatch在其中发挥了重要作用。
The Shell windows collection包括文件浏览器窗口和Web浏览器窗口(Internet Explorer和第三方Web浏览器)。通常,每个Shell窗口都实现IDispatch。 IShellWindows :: Item和IShellWindows :: FindWindowSW提供了访问Shell窗口的IDispatch接口的方法。
..以及IShellWindows和IWebBrowserApp / IWebBrowser2之间的连接:
exdisp.h contains the following programming interfaces
- IShellWindows
- IWebBrowser2
IWebBrowserApp-> IShellBrowser:
Objects that have access to the site chain of the browser can get a reference to the browser on IShellBrowser using IServiceProvider::QueryService,带有服务ID,例如SID_STopLevelBrowser和SID_SCommDlgBrowser。有关使用服务ID的更多信息,请参见Knowledge Base article Retrieve the Top-Level IWebBrowser2 Interface from an ActiveX Control。
Web浏览器和外壳如此连接的事实对于那些对Windows 98 / IE 4时间框架内的Windows感兴趣的人来说并不奇怪。 Internet Explorer和File Explorer基本上是同一件事。资源管理器可以显示网页,而IE可以显示“文件列表”(IShellView)。
IShellBrowser-> IShellView:
只需简单地调用QueryActiveShellView
。
这里有一个关键点; IShellFolder / IShellView可以由第三方外壳扩展实现。资源管理器实现了IShellBrowser,托管IShellView的是IShellBrowser,第三方ISV也可以创建实现IShellBrowser的文件浏览器。从理论上讲,您可以有一个由一家公司创建的文件浏览器应用程序,该应用程序托管由另一家公司创建的不带Microsoft代码的外壳视图。 IShellBrowser和IShellView就是彼此的观看方式。
IShellView-> IFolderView:
这里没有直接连接,但是如果您环顾四周,就可以连接圆点。
[IShellFolderView从Windows 7开始不再可用。相反,请使用IFolderView2和IFolderView。]
在其他情况下,您找不到特定的文档,您只需要尝试查询您感兴趣的接口。该外壳程序也有大量未记录的接口,如果您想尝试使用调试器,则是唯一的选择那些。