晚期绑定&在VB中键入问题

时间:2017-11-16 00:39:40

标签: vb.net types casting compiler-errors late-binding

我试图运行我最初使用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

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

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方法之间的类型区别有关。我想我必须转换objIEShell这样的CType(objIEShell,?),但我不知道.Windows方法的类型或如何找到它。此外,任何关于如何修复第二个错误的见解都会受到高度赞赏,因为我不确定从哪个开始。

1 个答案:

答案 0 :(得分:11)

这可以追溯到微软仍然计划让资源管理器像网络浏览器一样的好日子。使得到达正确的代码非常困难,它是两个独立的COM组件的组合,彼此没有多大关系。

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

现在你可以像这样编写早期代码:

    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属性的类型为Object,以打破这两个组件之间的依赖关系。演员阵容是保持编译器满意的必要巫术。