如何在Delphi中调用EnumSystemLocales?

2024-01-06

我正在尝试打电话EnumSystemLocales http://msdn.microsoft.com/en-us/library/windows/desktop/dd317828%28v=vs.85%29.aspx在德尔福。例如: http://www.podgoretsky.com/ftp/Docs/Delphi/D5/dg/intapps.html

{ 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;

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

Note: EnumSystemLocales is返回true,表示成功。

的言论EnumSystemLocales说我的回调必须返回true继续枚举(或更正确地说,不得返回false继续枚举):

该函数通过传递区域设置标识符来枚举区域设置,其中一个位于 一次,到指定的应用程序定义的回调函数。这 继续,直到所有已安装或支持的区域设置标识符 已传递给回调函数或回调函数 返回 FALSE。

On the 回调函数的文档 http://msdn.microsoft.com/en-us/library/windows/desktop/dd317822%28v=vs.85%29.aspx:

BOOL CALLBACK EnumLocalesProc(
  __in  LPTSTR lpLocaleString
);

评论者遇到了“不假”定义的问题:

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

这让我觉得delphi的定义

True: BOOL;

与Windows不同。 (这就是为什么我尝试返回值BOOL(1)- 仍然失败)。

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

不管怎样,有人可以建议如何在 Delpi 中调用EnumSystemLocales?


Edit: 还尝试过:

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

尝试声明LocalesCallback像这样的功能

function LocalesCallback(Name: PChar): Integer; stdcall;

检查这个样本

{$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.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Delphi中调用EnumSystemLocales? 的相关文章

随机推荐