gpt4 book ai didi

Delphi unicode 移植 : Incompatible types: 'Char' and 'AnsiChar' error with Win32 functions like CharToOEM?

转载 作者:行者123 更新时间:2023-12-03 14:53:48 25 4
gpt4 key购买 nike

我正在尝试将一些旧的 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 例程?

最佳答案

在 Unicode Delphi 中,CharToOem 映射到具有以下签名的 Unicode 版本 CharToOemW:

function CharToOem(Source: PWideChar; Dest: PAnsiChar): BOOL; stdcall;

因此您需要提供 ANSI 输出缓冲区,但您的代码提供了 Unicode 输出缓冲区。

自然的转换是切换到 AnsiString 返回值。同时将该函数重命名为 StringToOem 以更好地反射(reflect)其功能。

function StringToOem(const S: String): AnsiString;
begin
SetLength(Result, Length(S));
if S <> '' then begin
CharToOem(PChar(S), PAnsiChar(Result));
end;
end;

另一种方法是就地转换为 OEM,但为此您需要传入 ANSI 字符串并显式调用 ANSI 版本的 API 调用。

function AnsiStringToOem(const S: AnsiString): AnsiString;
begin
Result := S;
UniqueString(Result);
if S <> '' then begin
CharToOemA(PAnsiChar(Result), PAnsiChar(Result));
end;
end;

我确实必须评论说,我很惊讶地看到 OEM 字符集在现代仍然被积极使用。我以为它已经走上了恐龙的道路!

关于Delphi unicode 移植 : Incompatible types: 'Char' and 'AnsiChar' error with Win32 functions like CharToOEM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9689650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com