以下是我用来检测默认系统语言的代码:
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;
有人可以猜出原因吗?
答案 0 :(得分:1)
第二次调用GetLocaleInfo会覆盖内存,因为GetLocaleInfo会返回字符数,并且您使用的是Delphi的unicode版本,那么每个字符需要分配2个字节。
您可以通过以下方式修复它:GetMem(Buffer,Size * SizeOf(Char)); // SizeOf(Char)== SizeOf(WideChar)on> = D2009