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;尝试声明这样的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)