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のプロセスがロギングされていました。
あとは、そのログを確認すると、上記の理由がわかり、その対処を導き出す事ができた。
という流れです。