2014年6月13日金曜日

ThinAppで仮想化したアプリのIME問題について(重要)

ThinAppで仮想化したアプリのIME問題について(重要)

ThinAppで仮想化したアプリケーションを利用していると
IMEの変換や単語登録した物が変換候補に表示されない問題が発生することが多々あります。

日本でThinAppを利用する場合は、必須のTipsなので必ず対処した方が良いと思い
公開する事にしました。


症状は色々とありますが、代表的なケースは、
「IMEの変換候補に辞書登録した物が表示されない」
になります。

結論としては、IMEのユーザー辞書ファイル(IMJPxx.dic)がSanboxに迂回されるために
物理側にあるユーザー辞書ファイルとのやり取りで問題が発生するためです。
対処方法は、IMEのユーザー辞書ファイルの格納されているフォルダの
DirectoryIsolationModeをMergedにすることで対処可能です。

具体的な対処方法は、プロジェクトフォルダの%AppData%に
Microsoft\IMJP10フォルダを作成し
##Attributes.iniファイルのDirectoryIsolationModeをMergedに設定した後に
再Buildを行います。




具体的な動作については、こんな感じです。

テスト環境:
 実行環境:
  OS:Windows7 SP1 x86
  IME:IME10 Windows7標準

 キャプチャ環境:
  OS:Windows XP SP3 x86
  IME:IME8_1 WindowsXP標準

 仮想化したアプリ:
  SimpleBrowser(MBCS).exe
   Sandbox名:SimpleBrowser(MBCS)
  Sandbox作成先:既定値 %AppData%\Thinstall

事前準備:
 Windows7で単語登録を行ないます。

 読み:あぷり
 語句:アプリ仮想化

 メモ帳で単語が変換候補に表示されるかの確認
 問題なく表示されています。

問題になる動作の確認:
 Windows7で仮想化したSimpleBrowserを起動し単語が変換候補に表示されるか
確認します。



変換候補に単語登録した「アプリ仮想化」がありません。

IME辞書ツールを起動しても、登録したはずの単語がありません。
また、辞書ファイルのパスが表示されていな不正な状態になっています。
※辞書ファイルのパスが表示されていないため、登録した単語も変換候補に表示されません。

無理やり登録しようとすると、こんな感じでエラーが発生します。
「単語登録に失敗しました。」
重要なポイント
SandboxにIMEのユーザー辞書ファイルの格納先フォルダが分離されてしまっているからです。
<%Appdata%\Microsoft\IMJP10>

対処方法:
プロジェクトフォルダの%AppData%のIsolationModeを変更します。

変更前の状態



対処後の状態
%AppData%にMicrosoft\IMJP10フォルダを作成し
IMJP10フォルダに、##Attributes.iniファイルをMergedで設定する。
完了したら再Buildを行います。

Fix確認
再Buildを行った仮想アプリをWindows7で確認します。

※重要:
  動作確認を行う前に、Sanboxを削除(リネーム)してから確認してください。
 すでにSanboxに分離してしまったフォルダは、パッケージ側で属性を変更しても
 反映されません。WriteCopyで分離済みのフォルダをパッケージ側でMergedにしても
 Sandboxの属性が優先されます。
  FULL > WriteCopy > Mergedの優先度があるのとSadboxとパッケージの優先度も加味する必要があります。

以上

余談:
今回は、IME10に特化した方法を掲載しましたが
IMEには、色々なバージョンがあるので、利用するバージョンに合わせて
対処してください。

IMJP8_1
IMJP9_0
IMJP10
IMJP11
IMJP12
IMJP14
IME\15.0

また、IME2007・IME2010やWindows8の標準IMEを利用する場合は
以下の対処をPackage.iniに入れておくほうが良いと思います。

Package.iniの内容
[BuildOptions]
ExternalCOMObjects={FCE4078B-72B5-4122-95E4-45B5E2E88031};{F57CA90F-D309-4056-9616-6670A27BE8A1}
ChildProcessEnvironmentExceptions=svchost.exe;DLLHost.exe;msiexec.exe;explorer.exe;ImeBroker.exe