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

unk*_*nse 5 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
Run Code Online (Sandbox Code Playgroud)

该代码只是在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
Run Code Online (Sandbox Code Playgroud)

从研究我迄今所做我认识的第一个错误消息,第2行是objIEShell和Windows之间的方法类型的差异做.我想我必须objIEShell像这样转换CType(objIEShell,?),但我不知道.Windows方法的类型或如何找到它.此外,任何关于如何修复第二个错误的见解都将受到极大的赞赏,因为我不知道从哪一个开始.

Han*_*ant 11

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

您需要首先添加对这些组件的两个引用,以便编译器理解名称.使用项目>添加引用> COM选项卡,然后勾选"Microsoft Internet Controls"和"Microsoft Shell控件和自动化".这增加了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
Run Code Online (Sandbox Code Playgroud)

CType()表达式可能是最不直观的,Shell.Windows属性的类型为Object,以打破这两个组件之间的依赖关系.演员阵容是保持编译器满意的必要巫术.