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のままにしておけば良かったんじゃね? と強く思う。正式版では変更になるんじゃないかな。

この記事へのコメント

この記事へのトラックバック