VB 中的后期绑定和类型问题

Late Binding & Type Issues In VB

我正在尝试 运行 我的代码,该代码最初是使用 Visual Studio 创建的,通过另一个不允许后期绑定的应用程序,不幸的是这个选项无法更改。总的来说,我对编程还很陌生,并且在努力解决这个问题。这是我在调用代码阶段使用的代码:

Dim objIEShell As Object = CreateObject("Shell.Application")
Dim objIEShellWindows As Object = objIEShell.Windows
Dim objIEWin As Object
For Each objIEWin In objIEShellWindows
    If InStr(objIEWin.LocationURL,"google")>0 Then
        objIEWin.Quit
        objIEWin = Nothing
    End If
Next

该代码只是关闭 URL 中带有 "google" 的所有 Internet Explorer 实例。这是我在尝试编译时收到的错误消息:

Message: Error compiling code
error BC30574: Option Strict On disallows late binding. At line 2
error BC32023: Expression is of type 'Object', which is not a collection type. At line 4

根据我目前所做的研究,我意识到第 2 行的第一条错误消息与 objIEShell 和 Windows 方法之间的类型差异有关。我想我必须像这样转换 objIEShellCType(objIEShell,?),但我不知道 .Windows 方法的类型或如何找到它。另外,任何有关如何修复第二个错误的见解都将不胜感激,因为我也不确定从哪里开始。

这可以追溯到微软仍然计划让 Explorer 像 Web 浏览器一样运行的古怪日子。很难找到正确的代码,它是两个彼此没有太多关系的独立 COM 组件的组合。

您需要先添加两个对这些组件的引用,以便编译器理解这些名称。使用项目 > 添加引用 > COM 选项卡并勾选 "Microsoft Internet Controls" 和 "Microsoft Shell Controls and Automation"。这会添加 Shell32 和 SHDocVw 命名空间。

现在你可以像这样编写 early-bound 代码了:

    Dim objIEShell = New Shell32.Shell
    Dim objIEShellWindows = CType(objIEShell.Windows, SHDocVw.IShellWindows)
    Dim objIEWin As SHDocVw.WebBrowser
    For Each objIEWin In objIEShellWindows
        If InStr(objIEWin.LocationURL, "google") > 0 Then
            objIEWin.Quit()
        End If
    Next

CType() 表达式可能是最不直观的表达式,Shell.Windows 属性 是对象类型,以打破这两个组件之间的依赖关系。转换是让编译器开心的必要巫术。