2017-11-16 22 views
5

私は、レイトバインディングが許可されていない別のアプリケーションでVisual Studioを使用して作成したコードを実行しようとしていますが、残念ながらこのオプションは変更できません。私は一般的なプログラミングには非常に新しく、この問題について私の頭を浮かべるのに苦労しています。ここでは呼び出しコードの段階で使用してコードイムです:VBでレイトバインドとタイプの問題VBで

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に「グーグル」のInternet Explorerのすべてのインスタンスを閉じます。これはそれをコンパイルしようとしたとき、私は取得エラーメッセージです:

私は2行目の最初のエラーメッセージがobjIEShellとWindowsの間の型の違いを行うことです実現し、これまで行ってきた研究から
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 

方法。私はこれをCType(objIEShell,?)のようにobjIEShellに変換しなければならないと思いますが、.Windowsメソッドの型や見つけ出す方法がわかりません。また、2番目のエラーをどのように修正するかについての洞察は、どこから始めるのか分かりません。

+0

モジュールごとにOption Strictをオフにすることができます。コードファイルの先頭に「Option Strict Off」と入力してください。 – SSS

+1

私が使用しているプログラムではこれが許されていません。この設定を変更せずに問題を解決する方法を知りたいと思います。ありがとう – unknownpresense

答えて

10

これは、マイクロソフトが引き続きエクスプローラをウェブブラウザのように動作させる計画をしていた時代である。正しいコードに到達するのがかなり難しくなります。それはお互いにあまり関係のない2つの別々のCOMコンポーネントの組み合わせです。

コンパイラが名前を理解できるように、これらのコンポーネントへの参照を2つ追加する必要があります。プロジェクト>参照の追加> COMタブを使用し、「Microsoftインターネットコントロール」と「Microsoftシェルコントロールとオートメーション」にチェックを入れます。これにより、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型であるが2つのコンポーネント。キャストは、コンパイラを幸せにするために必要なブードーです。