如何在Delphi中调用EnumSystemLocales?

Ian*_*oyd 9 delphi globalization winapi internationalization delphi-5

我想打电话给EnumSystemLocales德尔福.例如:

{ Called for each supported locale. }
function LocalesCallback(Name: PChar): BOOL; stdcall;
begin
   OutputDebugString(Name);
   Result := Bool(1); //True
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   EnumSystemLocales(@LocalesCallback, LCID_SUPPORTED);
end;
Run Code Online (Sandbox Code Playgroud)

问题是回调只被调用一次.

注: EnumSystemLocales 返回true,表示成功.

这句EnumSystemLocales话说我的回调必须返回true才能继续枚举(或者更准确地说,不能返回false继续枚举):

该函数通过将区域设置标识符(一次一个)传递给指定的应用程序定义的回调函数来枚举区域设置.这将一直持续到所有已安装或支持的语言环境标识符都已传递给回调函数或回调函数返回FALSE.

关于回调函数文档:

BOOL CALLBACK EnumLocalesProc(
  __in  LPTSTR lpLocaleString
);
Run Code Online (Sandbox Code Playgroud)

评论者遇到了"非虚假"定义的问题:

此函数必须返回1,而不是(DWORD)-1才能继续处理

这让我觉得delphi的定义

True: BOOL;
Run Code Online (Sandbox Code Playgroud)

与Window不同.(这就是我尝试返回值BOOL(1)- 仍然失败的原因).

接下来我想知道它是不是应该是stdcall.

无论哪种方式,有人可以建议如何在Delpi打电话EnumSystemLocales吗?


编辑:还试过:

  • Result := BOOL(-1);
  • Result := BOOL($FFFFFFFF);
  • Result := BOOL(1);
  • Result := True;

RRU*_*RUZ 9

尝试声明这样的LocalesCallback函数

function LocalesCallback(Name: PChar): Integer; stdcall;
Run Code Online (Sandbox Code Playgroud)

检查这个样本

{$APPTYPE CONSOLE}

{$R *.res}

uses
  Windows,
  SysUtils;

function LocalesCallback(Name: PChar): Integer; stdcall;
begin
   Writeln(Name);
   Result := 1;
end;

begin
  try
    EnumSystemLocales(@LocalesCallback, LCID_SUPPORTED);
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
Run Code Online (Sandbox Code Playgroud)

  • @menjaraz - 这是该语言中缺少/不兼容的数据类型的解决方法.请参见http://qc.embarcadero.com/wc/qcmain.aspx?d=72852 (3认同)
  • 有趣的是,FPC在春季也有类似的问题(主要是)GTK.现在有boolean8/16/32. (2认同)