我正在尝试将一些旧的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单位
我可以以某种方式重写此AnsiToDos函数,还是需要编写自己的CharToOEM例程?
答案 0 :(得分:6)
在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字符集在现代仍在积极使用。我以为它已经走了恐龙之路!
答案 1 :(得分:-1)
最简单的将是(在C ++ Builder中):
typedef AnsiStringT<850> OEMString;
AnsiString (or String) aStr = L"my ansi text";
OEMString oStr = aStr; // convert
cout << oStr.c_str() << endl;