知道要在COM对象上查询的接口

时间:2019-06-06 00:45:15

标签: winapi interface com

我正在查看Raymond Chen的代码示例,here提供。据我了解,他使用IShellWindows界面获得了一个外壳项目。然后,使用该项目的IDispatch界面和对QueryInterface的调用,他跳到该项目的IWebBrowserApp界面。然后过了几行,他似乎跳到了项目的IServiceProvider界面。我的问题是,在使用QueryInterface之前,您如何知道IShellWindows项可能支持IWebBrowserAppIServiceProvider接口?例如,我看不到任何文档列出IShellWindows项目支持的所有接口。

1 个答案:

答案 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 is supported by the IShellView object that is returned from SHCreateShellFolderViewEx

     

[IShellFolderView从Windows 7开始不再可用。相反,请使用IFolderView2和IFolderView。]

在其他情况下,您找不到特定的文档,您只需要尝试查询您感兴趣的接口。该外壳程序也有大量未记录的接口,如果您想尝试使用调试器,则是唯一的选择那些。