В Unicode Delphi CharToOem
отображается на версию Unicode CharToOemW
, которая имеет следующую подпись:
function CharToOem(Source: PWideChar; Dest: PAnsiChar): BOOL; stdcall;
Таким образом, вам необходимо предоставить выходной буфер ANSI, но ваш код обеспечивает выходной буфер Unicode,
Естественным преобразованием является переключение на AnsiString
возвращаемое значение.В то же время переименуйте функцию в StringToOem
, чтобы лучше отразить, что она делает.
function StringToOem(const S: String): AnsiString;
begin
SetLength(Result, Length(S));
if S <> '' then begin
CharToOem(PChar(S), PAnsiChar(Result));
end;
end;
Альтернативой может быть преобразование в OEM на месте, но для этого вам нужно передать строку ANSI ивызовите версию API-вызова ANSI явно.
function AnsiStringToOem(const S: AnsiString): AnsiString;
begin
Result := S;
UniqueString(Result);
if S <> '' then begin
CharToOemA(PAnsiChar(Result), PAnsiChar(Result));
end;
end;
Я должен прокомментировать, что я удивлен, увидев, что набор символов OEM все еще активно используется в наши дни.Я думал, что это пошло по пути динозавров!