Почему EnumUILanguages ​​возвращает только один язык? - PullRequest
0 голосов
/ 23 февраля 2010

Я использую функцию Win API EnumUILanguages ​​в сборке Windows XP Embedded, в которой установлены языковые пакеты оболочки для китайского и французского языков (MUI), однако вызов API возвращает только один языковой код: 0409 (базовый установленный язык en-US ).

Если я загляну в реестр по адресу HKLM \ SYSTEM \ CurrentControlSet \ Control \ Nls \ MUILanguages ​​\, то я смогу увидеть все доступные языки (0409, 040C, 0804). Я предпочел бы использовать вызов API вместо непосредственного доступа к реестру .... любые предложения относительно того, почему этот вызов API возвращает только единственный язык?

Спасибо, Дункан


Обновление : немного кода и информации - я звоню из формы с блокнотом и кнопкой. Нажмите кнопку, вызов WinAPI инициируется, и указатель на свойство Strings TMemoBox передается, чтобы функция обратного вызова могла записать в него.

// 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 ]

2 голосов
/ 23 февраля 2010

EnumUILanguages ​​вызывает только обратный вызов, пока вы возвращаете true в обратном вызове. Может быть, вы возвращаете ложное право в первом обратном вызове, и EnumUILanguages ​​останавливается?

1 голос
/ 12 сентября 2014

Это довольно старый вопрос, но он все еще остается без ответа. Поскольку я столкнулся с той же проблемой и смог ее решить, я хочу поделиться своим решением.

Если вы разрабатываете под Delphi, проблема заключается в типе возврата функции обратного вызова. Объявите это как DWORD и напишите Result := 1. True Delphi не распознается как TRUE по коду вызова EnumUILanguages.

К счастью ;-) У модуля Delphi Winapi.Windows.pas отсутствует (под XE2) объявление для EnumUILanguages и тип функции его функции обратного вызова, поэтому вы можете объявить ее самостоятельно.

0 голосов
/ 24 февраля 2010

Установка dwFlags в 0 означает MUI_LANGUAGE_ID или MUI_LICENSED_LANGUAGES. Это подразумевает две вещи:

  • Вы не получаете названия языков, вы получаете «шестнадцатеричные идентификаторы языков». Я предположил бы, что они - правильные PWideChars, но я не был бы уверен на 100%. Ты?
  • Вы получаете только лицензированные языки, которые могут объяснить единственный результат. Попробуйте использовать флаг MUI_ALL_INSTALLED_LANGUAGES.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...