IE の保護モードの違いによって整合性レベルの切り替えの有無が変わりオートメーションの操作に影響が出る場合がある

IE のオートメーションでインスタンスを操作できなくなる場合がある。

たとえばこんなことをしたくても

ie = CreateObject("InternetExplorer.Application") 

ie.Visible = True
ie.Navigate2(CType(url, Object))

While ie.Busy
    System.Threading.Thread.Sleep(100)
End While

While ie.ReadyState <> tagREADYSTATE.READYSTATE_COMPLETE
    System.Threading.Thread.Sleep(100)
End While

こういうエラーが出ることがある

起動されたオブジェクトはクライアントから切断されました。
(HRESULT からの例外:0x80010108 (RPC_E_DISCONNECTED)) 

保護モード

  • IE の保護モードがオンの場合、CreateObject("InternetExplorer.Application")(または New InternetExplorer) でオートメーションが可能
  • 保護モードがオフの場合、CreateObject("InternetExplorer.ApplicationMedium")(または New InternetExplorerMedium) とする必要がある

理由

  • Integrity Level(整合性レベル)
    • 保護モードがオンの場合、整合性レベルが低(LowIL)でオートメーションのインスタンスが生成される
    • オフの場合、整合性レベルは中(MediumIL)になる

IEインスタンスはデフォルトで LowIL となる。しかし保護モードがオフだと、Navigate で URI を指定後に MediumIL のインスタンスに切り替わる。オートメーションで受け取るのは LowIL で生成された最初のインスタンスなので、その後切り替わった MediumIL で行われる操作のメッセージを受け取ることができず、操作不能になる。

保護モードがオンの場合は、URI 指定後も LowIL のプロセスが継続するため、オートメーションからの操作が可能となる。

保護モードがオフの場合の IL の切り替えを防ぐには、IE を明示的に MediumIL でインスタンス化(CreateObject("InternetExplorer.ApplicationMedium"))する必要がある。

参考: