为什么EnumUILanguages只返回一种语言?

时间:2010-02-23 15:07:48

标签: delphi winapi localization mui

我在安装了中文和法语shell语言包(MUI)的Windows XP Embedded版本上使用Win API函数EnumUILanguages,但API调用只返回一种语言代码: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;

3 个答案:

答案 0 :(得分:2)

只要在回调中返回true,EnumUILanguages只会调用回调。可能是你在第一个回调中返回false并且EnumUILanguages停止了吗?

答案 1 :(得分:1)

这是一个相当古老的问题,但仍然没有答案。因为我遇到了同样的问题而且能够解决它,我想分享我的解决方案。

如果您在Delphi下开发,问题是回调函数的返回类型。将其声明为DWORD并写入Result := 1。调用代码True无法将Delphi的TRUE识别为EnumUILanguages

幸运的是;-) Delphi的单位Winapi.Windows.pas缺少(在XE2下)EnumUILanguages的声明及其回调函数的函数类型,因此您可以自己声明它。

答案 2 :(得分:0)

将dwFlags设置为0表示MUI_LANGUAGE_ID或MUI_LICENSED_LANGUAGES。这意味着两件事:

  • 您正在获取语言名称,您正在获得“十六进制语言标识符”。我认为他们是正确的PWideChars,但我不会100%肯定。你是?
  • 您只获得授权语言,这可能解释了单一结果。尝试使用MUI_ALL_INSTALLED_LANGUAGES标志。