2013年8月5日月曜日

ThinApp で仮想化した SimpleBrowser の起動が Windows8 だけ遅い問題について (COM OutProcess Serverの制御)

ThinApp で仮想化した SimpleBrowser の起動が Windows8 だけ遅い問題について (COM OutProcess Serverの制御)

ThinAppで仮想化したSimpleBrowser (※1) の起動が、何故かWindows8 だけ遅い問題が発生しました。
空白ページを表示するのに約10秒かかります。

Windows7 等の他のOSでは、まったく問題なく、2秒もかからず表示されます。

(※1)
SimpleBrowserの入手先(フリーソフト)
http://nilbrowser.ifdef.jp/


原因:
Windows8 では、IEコンポーネントを利用したプログラムの実行時に
Shell関連の整合性チェック用のEXEが起動するからです。
そのチェック用のRundll32.EXEが終了するまで、本体であるSimpleBrowserの起動が
ブロックされ、全体で約10秒前後、起動に時間が掛かるようになっています。

Rundll32.exeが起動
起動コマンドラインは、以下になります。
C:\Windows\System32\rundll32.exe shell32.dll,SHCreateLocalServerRunDll {9BA05972-F6A8-11CF-A442-00A0C90A8F39} –Embedding

余談:
COMのOutProcess Serverの実行をVOSで、制御する方法を学ぶ事が重要だったりします。
ThinAppにおける、OutProcess Serverの制御方法が4パターンある事を伝えたいと思い
投稿してみました。
今回の表面上の問題は、起動遅延でしたがそれ以外にも、COM Outprocess Serverで
弊害が発生することがあるので、そんな時は、以下の対処を頭の片隅にでも入れておいてください。



対処方法:
対処方法は、4パターンあります。

いずれかの1つの対応を行えば、
起動速度の問題は、解消されます。

※4つの対処を全部設定する必要はありません。

パターン1.
  方針:遅延の原因になっている、Rundll32.exeを仮想環境(VOS)で動作しないように除外する。
Package.iniファイルに以下を追加します。

  [BuildOptions]
  ChildProcessEnvironmentExceptions=rundll32.exe 

 ※ChildProcessEnvironmentExceptionsに関しては、こちらを参照ください。
VOS上の仮想プロセスとして、指定したEXEを除外(物理側で実行)する設定値です。
  http://tunemicky.blogspot.jp/2012/03/thinapp-47-packageini.html


パターン2.
  方針:遅延の原因になっている、COM OutProcess Serverを仮想環境(VOS)で動作しないように除外する。
  GUID: {9BA05972-F6A8-11CF-A442-00A0C90A8F39}
Package.iniファイルに以下を追加します。

  [BuildOptions]
  ExternalCOMObjects= {9BA05972-F6A8-11CF-A442-00A0C90A8F39} 

 ※ExternalCOMObjectsに関しては、こちらを参照ください。
VOS上で指定したGUIDを持つCOM OutProcessの作成を除外(物理側で実行)する設定値です。
  http://tunemicky.blogspot.jp/2012/03/thinapp-47-packageini.html

パターン3.
  方針:遅延の原因になっている、COM OutProcess 自体を仮想環境(VOS)で動作しないように強制する。
Package.iniファイルに以下を追加します。

  [BuildOptions]
  VirtualizeExternalOutOfProcessCOM=0

 ※VirtualizeExternalOutOfProcessCOMに関しては、こちらを参照ください。
VOS上でCOM OutProcessの作成を除外(物理側で実行)する設定値です。
パッケージに含まれているCOM OutProcess 自体は、仮想環境で動作する。
今回のGUIDは、物理側のみに存在している。
  http://tunemicky.blogspot.jp/2012/03/thinapp-47-packageini.html

パターン4.
  方針:遅延の原因になっている、COM OutProcess 自体を仮想レジストリの変更により動作しないようにする。
HKEY_LOCAL_MACHINE.txtファイルに以下を追加します。

isolation_writecopy HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{9BA05972-F6A8-11CF-A442-00A0C90A8F39}\LocalServer32
  Value=
  REG_SZ~#2300

追記:
 なぜWindows8だけ遅いのか、
 物理側のレジストリをWindows7とWindows8で見比べてみると
 その違いが分かります。
 Windows7の場合は、特別な設定がありません。









Windows8の場合だけ、特別な設定があります。







 このGUIDを検索してみたのですが、何のためにあるのかまでは、わかりませんでした。。。

どのように私が、この問題を調査したのかというと、とても簡単です。
起動が速いWindows7でThinApp Logmonitorを起動した場合
起動が遅いWindows8でThinApp Logmonitorを起動した場合

比較した場合に、表示されるログの中に、Rundll32.exeのプロセスがロギングされていました。
あとは、そのログを確認すると、上記の理由がわかり、その対処を導き出す事ができた。
という流れです。