0

中国語とフランス語のシェル言語パック (MUI) がインストールされている Windows XP Embedded ビルドで Win API 関数 EnumUILanguages を使用していますが、API 呼び出しは 1 つの言語コードのみを返します: 0409 (ベースの en-US インストール言語)。

HKLM\SYSTEM\CurrentControlSet\Control\Nls\MUILanguages\ の下のレジストリを見ると、利用可能なすべての言語 (0409、040C、0804) を確認できます。レジストリに直接アクセスするよりも API 呼び出しを使用したいのですが....この API 呼び出しが唯一の言語を返す理由について何か提案はありますか?

ありがとう、ダンカン


更新: 少しのコードと情報 - メモ ボックスとボタンを含むフォームからこれを呼び出しています。ボタンを押すと、WinAPI 呼び出しが開始され、TMemoBox の Strings プロパティへのポインタが渡されて、コールバック関数が書き込みできるようになります。

// The Button handler
procedure TForm1.btnEnumLangsClick(Sender: TObject);
var
  dwFlags : DWORD;
  callback : TEnumUILanguagesProc;
begin
  dwFlags := 0; // Same as MUI_LANGUAGE_ID for WinXP compat

  EnumUILanguagesW( @EnumUILanguages_Callback,
    dwFlags,
    LParam(memoUILangs.Lines) // Pointer to Memo box text lines
  );

end;


// API Callback function:
function EnumUILanguages_Callback(lpUILanguageString: PWideChar;
  List: TStringList): BOOL; stdcall;
begin
  // Add language ID to the memo box
  List.Add(lpUILanguageString);
  // Return true so the callback continues to run
  Result := True;
end;
4

3 に答える 3

2

EnumUILanguages は、コールバックで true を返す限り、コールバックのみを呼び出します。最初のコールバックで false を返し、EnumUILanguages が停止する可能性がありますか?

于 2010-02-23T15:39:41.353 に答える
1

これはかなり古い質問ですが、まだ答えがありません。同じ問題に遭遇して解決できたので、解決策を共有したいと思います。

Delphi で開発している場合、問題はコールバック関数の戻り値の型です。と宣言してDWORD書きResult := 1ます。Delphi のは、 の呼び出しコードによってTrueとして認識されません。TRUEEnumUILanguages

幸いなことに ;-) Delphi のユニットWinapi.Windows.pasには (XE2 の下で)EnumUILanguagesコールバック関数の宣言と関数型がないため、独自に宣言できます。

于 2014-09-12T13:27:59.677 に答える
0

dwFlagsを0に設定すると、MUI_LANGUAGE_IDまたはMUI_LICENSED_LANGUAGESを意味します。これは2つのことを意味します:

  • 言語名を取得していることに注意してください。「16進言語識別子」を取得しています。それらは適切なPWideCharsであると思いますが、100%確実ではありません。あなたは?
  • ライセンスされた言語のみを取得しているため、単一の結果を説明できる可能性があります。MUI_ALL_INSTALLED_LANGUAGESフラグを使用してみてください。

于 2010-02-24T05:53:01.507 に答える