GetLocaleInfo阻止我的应用程序退出

时间:2013-06-09 15:56:13

标签: windows delphi localization locale

以下是我用来检测默认系统语言的代码:

var
  Buffer    : PChar;
  Size      : integer;
  LocaleName: String;
begin
  Size := GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SENGLANGUAGE, nil, 0);
  GetMem(Buffer, Size);
  try
    GetLocaleInfo (LOCALE_USER_DEFAULT, LOCALE_SENGLANGUAGE, Buffer, Size);
    LocaleName := string(Buffer);
  finally
    FreeMem(Buffer);
  end;
  ShowMessage(LocaleName);
end;

这段代码效果很好,唉,只要代码在那里我的应用程序将不会退出,直到我使用任务管理器来停止它。最后,我发现这个小代码也可以解决问题并允许我的应用程序退出:

Var
 MyLang: PChar
 LocaleName: string;
 Ident: integer;
begin
  GetMem(MyLang, 250);
  try
    Ident:=GetSystemDefaultLangID;
    VerLanguageName(Ident, MyLang, 250);
    LocaleName := StrPas(MyLang);
  Finally
    FreeMem(MyLang);
  end;
  ShowMessage(LocaleName);
end;

有人可以猜出原因吗?

1 个答案:

答案 0 :(得分:1)

第二次调用GetLocaleInfo会覆盖内存,因为GetLocaleInfo会返回字符数,并且您使用的是Delphi的unicode版本,那么每个字符需要分配2个字节。

您可以通过以下方式修复它:GetMem(Buffer,Size * SizeOf(Char)); // SizeOf(Char)== SizeOf(WideChar)on> = D2009