Delphi Unicode портирование: несовместимые типы: ошибка «Char» и «AnsiChar» с функциями Win32, такими как CharToOEM? - PullRequest
6 голосов
/ 13 марта 2012

Я пытаюсь преобразовать какой-то старый код Delphi 7 в Delphi 2010

function AnsiToDOS(S: String): String;
begin
  SetLength(Result, Length(S));
  if S <> '' then begin
     CharToOEM(PChar(S), PChar(Result));
  end;
end;

Я получаю сообщение об ошибке «Несовместимые типы:« Char »и« AnsiChar »» в строке:

CharToOEM (внешняя функция User32) найдена в

Windows.pas unit

Можно ли как-то переписать эту функцию AnsiToDos или мне нужно написать собственную подпрограмму CharToOEM?

Ответы [ 2 ]

6 голосов
/ 13 марта 2012

В 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 все еще активно используется в наши дни.Я думал, что это пошло по пути динозавров!

0 голосов
/ 07 октября 2015

Самым простым будет (в C ++ Builder):

typedef AnsiStringT<850> OEMString;
AnsiString (or String) aStr = L"my ansi text";
OEMString oStr = aStr;  // convert
cout << oStr.c_str() << endl;
...