Windows8上でのIFELanguageについて
Windows8 Release Preview上でIFELanguageを利用する場合の注意点は・・・
CLSID={019f7150-e6db-11d0-83c3-00c04fddb82e}を直接指定してCOMオブジェクトを生成せず、MSIME.Japan、もしくはMSIME.Japan.FELangを利用する。憶測ではあるが、名称から「MSIME.Japan.FELang」を利用するべきだと考える。
■ 背景
色々あって調べていると、WhiteBrowserはCLSID={019f7150-~}を直接指定しており、COMオブジェクトの生成に失敗しているにも拘わらず、そのまま処理を続けているためメモリ破壊~ランタイムエラーとなっている事が解った。
■ 調査結果
色々なパターンでWindows7 / Windows8 上でCOMオブジェクトを生成してみると、非互換部分が存在する事が判明した。
(1) CLSID={019f7150-e6db-11d0-83c3-00c04fddb82e}の定義
InprocServer32で指定されるDLLが最新バージョンのIMEに置き代わっている事自体は問題なさそうだが、ProgIDが「MSIME.Japan.FEDict.15」に、VersionIndependentProgIDが「MSIME.Japan.FEDict」となっている。(Windows7上では「MSIME.Japan.6」と「MSIME.Japan」)
(2) MSIME.Japan.FEDict、MSIME.Japan.FELang、他の新設
Windows7上では「MSIME.Japan」しか存在しなかったが、そのサブカテゴリが新設されている。FEDictがIFEDictionary、FELangがIFELanguageのインターフェイスに対応している? ただし、最終的なDLLは全てimjpapi.dllにマップされている。
(3) CLSID={019f7150-~、IID=IFELanguageでCoCreateInstanceが失敗する
Windows8上で、CLSID={019f7150-~、IID=IFELanguageを指定してCoCreateInstanceを実行すると、E_NOINTERFACE(0x80004002)のエラーコードで失敗する。これは指定のインターフェイスがサポートされていないとう意味である。MSIME.Japan.FELangやMSIME.Japanでは成功し、どれも同じDLLを参照しているにも拘わらず結果が違う事に疑問を感じるが、COMの知識がさほどある訳でもないのでそこは流す。
(4) Windows 8 Release Preview 上の定義
MSIME.Japan関連で関係のありそうな定義の一覧は以下のとおり。
※ IFELanguageを取得できない物たち
CLSID(文字列表現)=MSIME.Japan.FEDict
マップ先→MSIME.Japan.FEDict.15
CLSID(文字列表現)=MSIME.Japan.FEDict.15
マップ先→{019f7150-e6db-11d0-83c3-00c04fddb82e}
CLSID={019f7150-e6db-11d0-83c3-00c04fddb82e}
InprocServer32=C:\Windows\SysWOW64\IME\IMEJP\imjpapi.dll
ProgID=MSIME.Japan.FEDict.15
※ IFELanguageを取得できる物たち
CLSID(文字列表現)=MSIME.Japan
CLSID(文字列表現)=MSIME.Japan.11
CLSID(文字列表現)=MSIME.Japan.15
マップ先→{6a91029e-aa49-471b-aee7-7d332785660d}
CLSID={6a91029e-aa49-471b-aee7-7d332785660d}
InprocServer32=C:\Windows\SysWOW64\IME\IMEJP\imjpapi.dll
ProgID=MSIME.Japan.15
CLSID(文字列表現)=MSIME.Japan.FELang
マップ先→MSIME.Japan.FELang.15
CLSID(文字列表現)=MSIME.Japan.FELang.15
マップ先→{46b73c9c-0e62-41ee-86c0-2f8997777f48}
CLSID={46b73c9c-0e62-41ee-86c0-2f8997777f48}
InprocServer32=C:\Windows\SysWOW64\IME\IMEJP\imjpapi.dll
ProgID=MSIME.Japan.FELang.15
■ まとめ
なぜ互換を無くすような事そしたのかは不明であるが、CLSID直指定ではなく文字列表現を利用した方が無難だという事なのか?
でも、MSIME.Japan.FEDictに新CLSIDを付与し、{019f7150-~はMSIME.Japanのままにしておけば良かったんじゃね? と強く思う。正式版では変更になるんじゃないかな。
CLSID={019f7150-e6db-11d0-83c3-00c04fddb82e}を直接指定してCOMオブジェクトを生成せず、MSIME.Japan、もしくはMSIME.Japan.FELangを利用する。憶測ではあるが、名称から「MSIME.Japan.FELang」を利用するべきだと考える。
■ 背景
色々あって調べていると、WhiteBrowserはCLSID={019f7150-~}を直接指定しており、COMオブジェクトの生成に失敗しているにも拘わらず、そのまま処理を続けているためメモリ破壊~ランタイムエラーとなっている事が解った。
■ 調査結果
色々なパターンでWindows7 / Windows8 上でCOMオブジェクトを生成してみると、非互換部分が存在する事が判明した。
(1) CLSID={019f7150-e6db-11d0-83c3-00c04fddb82e}の定義
InprocServer32で指定されるDLLが最新バージョンのIMEに置き代わっている事自体は問題なさそうだが、ProgIDが「MSIME.Japan.FEDict.15」に、VersionIndependentProgIDが「MSIME.Japan.FEDict」となっている。(Windows7上では「MSIME.Japan.6」と「MSIME.Japan」)
(2) MSIME.Japan.FEDict、MSIME.Japan.FELang、他の新設
Windows7上では「MSIME.Japan」しか存在しなかったが、そのサブカテゴリが新設されている。FEDictがIFEDictionary、FELangがIFELanguageのインターフェイスに対応している? ただし、最終的なDLLは全てimjpapi.dllにマップされている。
(3) CLSID={019f7150-~、IID=IFELanguageでCoCreateInstanceが失敗する
Windows8上で、CLSID={019f7150-~、IID=IFELanguageを指定してCoCreateInstanceを実行すると、E_NOINTERFACE(0x80004002)のエラーコードで失敗する。これは指定のインターフェイスがサポートされていないとう意味である。MSIME.Japan.FELangやMSIME.Japanでは成功し、どれも同じDLLを参照しているにも拘わらず結果が違う事に疑問を感じるが、COMの知識がさほどある訳でもないのでそこは流す。
(4) Windows 8 Release Preview 上の定義
MSIME.Japan関連で関係のありそうな定義の一覧は以下のとおり。
※ IFELanguageを取得できない物たち
CLSID(文字列表現)=MSIME.Japan.FEDict
マップ先→MSIME.Japan.FEDict.15
CLSID(文字列表現)=MSIME.Japan.FEDict.15
マップ先→{019f7150-e6db-11d0-83c3-00c04fddb82e}
CLSID={019f7150-e6db-11d0-83c3-00c04fddb82e}
InprocServer32=C:\Windows\SysWOW64\IME\IMEJP\imjpapi.dll
ProgID=MSIME.Japan.FEDict.15
※ IFELanguageを取得できる物たち
CLSID(文字列表現)=MSIME.Japan
CLSID(文字列表現)=MSIME.Japan.11
CLSID(文字列表現)=MSIME.Japan.15
マップ先→{6a91029e-aa49-471b-aee7-7d332785660d}
CLSID={6a91029e-aa49-471b-aee7-7d332785660d}
InprocServer32=C:\Windows\SysWOW64\IME\IMEJP\imjpapi.dll
ProgID=MSIME.Japan.15
CLSID(文字列表現)=MSIME.Japan.FELang
マップ先→MSIME.Japan.FELang.15
CLSID(文字列表現)=MSIME.Japan.FELang.15
マップ先→{46b73c9c-0e62-41ee-86c0-2f8997777f48}
CLSID={46b73c9c-0e62-41ee-86c0-2f8997777f48}
InprocServer32=C:\Windows\SysWOW64\IME\IMEJP\imjpapi.dll
ProgID=MSIME.Japan.FELang.15
■ まとめ
なぜ互換を無くすような事そしたのかは不明であるが、CLSID直指定ではなく文字列表現を利用した方が無難だという事なのか?
でも、MSIME.Japan.FEDictに新CLSIDを付与し、{019f7150-~はMSIME.Japanのままにしておけば良かったんじゃね? と強く思う。正式版では変更になるんじゃないかな。
この記事へのコメント