delphi - 由于 StrAlloc 使用 StrAlloc 返回 PWideChar,PAnsiChar 和 PWideChar 类型不兼容

标签 delphi delphi-xe6

我知道这可能很简单,但有时 Unicode 问题会因为太多的考虑而困扰我。

我有这个代码:

pcBuffer := StrAlloc(Stream.Size + 1) where pcBuffer is defined as PWideChar

该组件现在想要 pcBuffer 作为 PAnsiChar,所以如果我这样做,我会收到错误

StrAlloc- Incompatible Types PAnsiChar and PWideChar

由于 StrAlloc 返回 PWideChar

如何解决这个问题?

我可以简单地以 Unicode 方式或通过 GetMem 键入强制转换为 PAnsiChar 或分配 它吗?

最佳答案

在 Delphi XE 中,SysUtils 单元定义了以下函数:

function AnsiStrAlloc(Size: Cardinal): PAnsiChar;
function WideStrAlloc(Size: Cardinal): PWideChar;
function StrAlloc(Size: Cardinal): PChar;

您应该调用 AnsiStrAlloc 来分配 PAnsiChar。它接收以字符为单位的 Size。您必须考虑空终止符。

var
  pcBuffer: PAnsiChar;
....
pcBuffer := AnsiStrAlloc(Stream.Size + 1);

但是,这些函数应被视为已弃用。它们在 Delphi 的后续版本中都有记录。相反,您可能应该使用 AnsiString,以便让编译器管理生命周期和内存分配。

var
  str: AnsiString;
  pcBuffer: PAnsiChar;
....
SetLength(str, Stream.Size);
pcBuffer := PAnsiChar(str);

缓冲区的生命周期由编译器管理,就像任何 Delphi 字符串变量的情况一样。

上面的代码很可能不是解决您实际问题的最佳方法。如果没有看到更多细节,很难确定最好的解决方案是什么。我唯一有理由相信的是 StrAlloc 和 friend 不是前进的方向。

关于delphi - 由于 StrAlloc 使用 StrAlloc 返回 PWideChar,PAnsiChar 和 PWideChar 类型不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25758131/

相关文章:

delphi - Delphi XE2 中自动重命名编译文件

delphi - Delphi中如何调用CreateProcess?

delphi - 将 TStreamReader 与 TZDecompressionStream 结合使用时出现 EZDecompressionError

android - delphi xe6 目标多字节代码页中不存在 Unicode 字符的映射

multithreading - Delphi中的线程问题

delphi - 如何在IDE中从插入符位置而不是从文件开头开始搜索?

android - 德尔福 'Cannot resolve unit name ' FireDac.phys.mysql'

mysql - FDQuery (Delphi XE6) 上的 "type mismatch expecting AutoInc actual LongWord"

delphi - 将泛型类转换为 Delphi 接口(interface)

delphi - 如何使鼠标悬停在“最小化”、“最大化”和“关闭”按钮上时表现良好?