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"))する必要がある。