不兼容类型PAnsiChar和PWideChar,因为StrAlloc使用StrAlloc返回PWideChar

时间:2014-09-10 05:47:23

标签: delphi delphi-xe6

我知道这可能很简单,但有时候因为太多的考虑因素,Unicode问题会给我带来太大麻烦。

我有这段代码:

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

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

  

StrAlloc-不兼容的类型PAnsiChar和PWideChar

因为StrAlloc返回PWideChar

我该如何解决这个问题?

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

2 个答案:

答案 0 :(得分:3)

在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和朋友不是前进的方式。

答案 1 :(得分:2)

您正在StrAlloc()单位拨打SysUtils,该单位会分配PWideChar

要分配PAnsiChar,请从StrAlloc()单元拨打AnsiStrings

uses
  ..., AnsiStrings;

pcBuffer := AnsiStrings.StrAlloc(Stream.Size + 1);