投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/3/31 10:30:55
> この点から見ても、やはりIME 依存である可能性が高いと考えられます。
GetPhonetic が IME 依存であることを裏付ける公式資料を発見。

KB870682 (2004/6/16) という古い資料ですが、Microsoft IME 2000/2002/2003 について下記のように書かれていました。

************
現象
 Excel でふりがなを使用した場合、数字に対して表示される候補の先頭は必ずしも数字にはなりません。 
詳細
 ふりがなリストを表示した場合や GetPhonetic 関数で引数に数字を指定した場合、
 指定する数字によって第一候補が数字になるものとカタカナになるものがあります。 
原因
 Excel のふりがなリストおよび GetPhonetic 関数は、IME の GetJMorphResult() インターフェースを
 使用してふりがな候補を取得しています。
 IME ではふりがな候補の並べ替え処理を行った結果を呼び出し元アプリケーションに返しますが、
 この並べ替えの処理では、元の文字が数字かどうかに関係なく、ふりがな候補となる文字列を
 単語単位に分割し、その文字数や品詞、前後につながる単語の情報など、多岐にわたる属性を評価しています。
 そのため、数字に対して表示されるふりがな候補の先頭が数字にならない場合があります。
************



> 「MSIME.China」の
> 「GetJMorphResult」の例があり、
> 使ってみたかったのですが、
> 何故か動きませんでした。
「動きませんでした」では状況が分からないです。具体的に何が起きたのかを教えてください。

COMクラスの生成ができない状態なのか、あるいは GetJMorphResult 呼び出しで
未実装HRESULT 値である E_NOTIMPL (0x80004001) が返されてくるとか、
未実装例外 NotImplementedException が飛んでくるとか、
あるいは MORRSLT 構造体の値が不審だったとか…。

念のため、実行環境の情報も添えて頂けますか。
どの言語のどのバージョンの Microsoft IME をインストールしているのか、
Office の言語設定をどの国にしているのかなど。(Office 設定は関係ないかもしれませんが、
Office IME / Microsoft IME バージョンによって振る舞いが異なる可能性があるかもしれない)

検索してみると、空文字列が返されてしまう事象の公式解説を見つけたのですが、
今踏んでみると、何故か Not Found になってしまって読めない…。
(/sitemap/index-f.xml で見る限りでは、2020年11月時点の情報っぽい?)
https://support.microsoft.com/ja-jp/topic/getjmorphresult-%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E9%9A%9B%E3%81%AB-%E7%A9%BA%E3%81%AE%E7%B5%90%E6%9E%9C%E3%81%8C%E8%BF%94%E3%81%95%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%8C%E3%81%82%E3%82%8B-fd358ab8-b859-6653-4164-95bdf902375c



> 他の国のIMEも、設定によっては、
> 「GetJMorphResult」は、動くのでしょうか?
試したことが無いのでわかりません! この分野にはそんなに詳しくないものでして。
https://learn.microsoft.com/ja-jp/windows/win32/api/msime/nf-msime-ifelanguage-getjmorphresult


> 動かし方とか、定数とかございましたら、お願いします。
IFELanguage インターフェイスで使う FELANG_ 系の定数値、
IFEDictionary インターフェイスで使う IFED_ 系の定数値や列挙値等々を知りたいなら、
まずは msime.h を読むところから始めましょう。

今だと Windows 11 SDK (10.0.22621.0) の msime.h Version 15 が最新だと思います。
https://developer.microsoft.com/ja-jp/windows/downloads/windows-sdk/


そこには HKEY_CLASSES_ROOT の値として 4 つの #define と…
#define szImeJapan          TEXT("MSIME.Japan")
#define szImeKorea          TEXT("MSIME.Korea")
#define szImeChina          TEXT("MSIME.China")
#define szImeTaiwan         TEXT("MSIME.Taiwan")

下記の Class ID が公開されていますね。
{6A91029E-AA49-471B-AEE7-7D332785660D} CLSID_VERSION_DEPENDENT_MSIME_JAPANESE



ただし msime.h の内容はバージョンによって情報量が結構増減するので、
可能であれば新旧バージョンを読み比べた方が良いかもしれません。
(ネットにあったサンプルが、今ではサポートを終了しているバージョン向けのもので
 あったという可能性があるかもしれない)

とりあえず、ここに msime.h Version 1.4 がありました。 https://searchcode.com/total-file/10960454/
このころは JPOS_ 系定数などに日本語のコメントが埋め込まれていますし、
今はサポートを終了した古い IME も並んでいますね。
#define szImeJapan98        TEXT("MSIME.Japan.6")
#define szImeJapan8         TEXT("MSIME.Japan.8")     // For MS-IME 8.0
#define szImeJapan9         TEXT("MSIME.Japan.9")     // For MS-IME 8.1
#define szImeJapan10        TEXT("MSIME.Japan.10")    // For MS-IME 9
#define szImeJapan12        TEXT("MSIME.Japan.12")    // For Office12 IME
#define szImeJapan11        TEXT("MSIME.Japan.11")    // For LH IME
#define szImeJapan          TEXT("MSIME.Japan")


{F1F62C04-3D26-4A08-A9E9-04B95B63F907}  CLSID_VERSION_DEPENDENT_MSIME_JAPANESE (Office IME)
{6A91029E-AA49-471B-AEE7-7D332785660D}  CLSID_MSIME_JAPANESE_11
{6A91029E-AA49-471B-AFE7-7D332785660D}  CLSID_VERSION_DEPENDENT_MSIME_JAPANESE (LH IME)
{A64BDBED-14B2-4F56-9C10-3DEBBC13FE7B}  CLSID_MSIME_JAPANESE_10 (IME 9)
{AF9EE286-8CD3-445E-8842-433E5C460775}  CLSID_MSIME_JAPANESE_9 (MSIME.9; Satori 8.1)
{462C11AD-BBBE-43E3-9976-FA8E6B0DFF01}  CLSID_MSIME_JAPANESE_8 (MSIME.8; Satori 8.0)
{019F7150-E6DB-11D0-83C3-00C04FDDB82E}  CLSID_MSIME_JAPANESE_6 (MSIME.6)