Du könntest statt dem CharToOem einfach mal SetFileApisToOEM versuchen.
>
SetFileApisToOEM,
SetFileApisToANSI und
AreFileApisANSI
Meckert dein Delphi 2009+ eigentlich nicht über den
Ansi-
Unicode-Mischmasch?
Für AnsiString mußt du OemToChar
A verwenden.
Delphi-Quellcode:
function OEM2Ansi(const OEMString: AnsiString): AnsiString;
begin
Result := OEMString;
if Result <> '' then
OemToCharA(PAnsiChar(Result), PAnsiChar(Result));
end;
oder mal so versuchen:
Delphi-Quellcode:
function OEM2Ansi(const OEMString: AnsiString): AnsiString;
begin
Result := OEMString;
if Result = '' then Exit;
OemToCharA(PAnsiChar(Result), PAnsiChar(Result));
PWord(Integer(Result) - 12)^ := 0;
end;
PS
Delphi-Quellcode:
type
PStrRec = ^StrRec;
StrRec = packed record
codePage: Word;
elemSize: Word;
refCnt: Longint;
length: Longint;
end;
OEMString = type AnsiString(CP_OEMCP);
procedure TForm5.FormCreate(Sender: TObject);
var A: AnsiString;
begin
A := UTF8Encode('äöü');
ShowMessage(A);
{$IF CompilerVersion >= 20.0}
if A <> '' then PStrRec(Integer(A) - SizeOf(StrRec)).codePage := CP_NONE;
ShowMessage(A);
{$IFEND}
A := 'äöü';
UniqueString(A); // Konstante in Variable umwandeln
CharToOemA(PAnsiChar(A), PAnsiChar(A));
{$IF CompilerVersion >= 20.0}
//if A <> '' then PStrRec(Integer(A) - SizeOf(StrRec)).codePage := CP_NONE;
ShowMessage(A);
if A <> '' then PStrRec(Integer(A) - SizeOf(StrRec)).codePage := CP_OEMCP;
{$IFEND}
ShowMessage(A);
end;
Delphi-Quellcode:
var S: AnsiString;
SetString(S, P, BytesRead); // von PAnsiChar
//SetString(S, @Buf[0], BytesRead); // von AnsiChar-Array
if S <> '' then PWord(Integer(S) - 12)^ := CP_OEMCP;
// und schon wandelt Delphi automatisch die Codepage um
ShowMessage(A);
Delphi-Quellcode:
var S: AnsiString;
SetString(S, P, BytesRead); // von PAnsiChar
//SetString(S, @Buf[0], BytesRead); // von AnsiChar-Array
if S <> '' then PWord(Integer(S) - 12)^ := CP_OEMCP;
ShowMessage(A);
und schon wandelt Delphi automatisch die Codepage um, wenn dieser AnsiString z.B. an einen String/UnicodeString übergeben wird.
(also ab Delphi 2009)