0

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

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;

谁能猜出其中的原因?

4

1 回答 1

2

Second call to GetLocaleInfo overwrites memory, because GetLocaleInfo returns number of chars, and you are using unicode version of Delphi, then you need allocate 2 bytes per char.

You can fix it by: GetMem(Buffer, Size * SizeOf(Char)); // SizeOf(Char)==SizeOf(WideChar) on >= D2009

于 2013-06-09T16:51:13.273 回答