Delphi unicode移植:不兼容的类型:CharToOEM等Win32函数出现’
发布时间:2020-12-15 09:52:13 所属栏目:大数据 来源:网络整理
导读:我正在尝试将一些旧的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’”错误
我正在尝试将一些旧的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以更好地反映它的作用. 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字符集在现代仍在积极使用.我以为它已经走了恐龙之路! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |