Hallo,
ich verwende folgenden Code um die Codepages aufzulisten, die Windows installiert hat.
Delphi-Quellcode:
Var CodePageNumbers : TArray<Cardinal>;
procedure GetCodepageList(Var CodePageList:TStringList);
function GetCPName(CP:Cardinal) : String;
var CpInfoEx : TCPInfoEx;
begin
Result := '';
if IsValidCodePage(Cp) then
begin
GetCPInfoEx(Cp, 0, CpInfoEx);
Result := Format('%s', [CpInfoEx.CodePageName]);
Result := ReplaceStr(Result,CP.ToString+' ','').TrimLeft;
Result := Copy(Result,2,length(Result)-2);
end;
end;
function EnumCodePagesProc(CodePage:PWideChar) : Cardinal; stdcall;
Var Cp : cardinal;
begin
Result := 0;
if (CodePage<>Nil) then
begin
if (Length(Codepage)>0) then
begin
Cp := StrToIntDef(CodePage,0);
if (cp>0) then
begin
SetLength(CodePageNumbers,Length(CodePageNumbers)+1);
CodePageNumbers[High(CodePageNumbers)] := CP;
Result := 1;
end;
end;
end;
end;
var I : Integer;
begin
SetLength(CodePageNumbers,0);
CodePageList.Clear;
EnumSystemCodePagesW(@EnumCodePagesProc, CP_SUPPORTED);
for I := 0 to High(CodePageNumbers) do
begin
if CodePageNumbers[i]>0 then
begin
CodepageList.Add(IntToString(CodePageNumbers[i],5) + ': '
+ GetCPName(CodePageNumbers[i]));
end;
end;
SetLength(CodePageNumbers,0);
end;
Das funktioniert und
Win32 problemlos, wenn ich jedoch auf Zielplattform Win64 umstelle kommt in der EnumCodePagesProc nichts mehr an. Ein Microsoft Bug, oder stelle ich mich nur zu blöd an? Oder gibt es dafür eine elegantere Lösung, ohne EnumSystemCodePages / EnumSystemCodePagesA / EnumSystemCodePagesW?