如何解决Delphi错误:不兼容的类型:'PWideChar'和'Pointer'

时间:2015-07-16 20:52:56

标签: delphi pointers delphi-xe4

我有来自Delphi 7的这段代码:

var
  lpRgnData: PRgnData;
  PC: PChar;  
  PR: PRect;
  ...

  PC := @(lpRgnData^.Buffer[0]);

在Delphi XE4中,它给出了以下编译错误:

Incompatible types: 'PWideChar' and 'Pointer'

如何更新此代码以在XE4中正常工作?

由于

1 个答案:

答案 0 :(得分:4)

此编译是否取决于type-checked pointers option的设置。您显然已启用该选项,这是一个很好的决定。这样做会导致更严格的类型检查。

禁用类型检查指针后,代码会编译。启用类型检查指针后,您的代码无法编译,这是您想要的,因为您的代码无效。

现在,讨论有问题的类型。它们在Windows单元中定义如下:

type
  PRgnData = ^TRgnData;
  {$EXTERNALSYM _RGNDATA}
  _RGNDATA = record
    rdh: TRgnDataHeader;
    Buffer: array[0..0] of Byte;
    Reserved: array[0..2] of Byte;
  end;
  TRgnData = _RGNDATA;
  {$EXTERNALSYM RGNDATA}
  RGNDATA = _RGNDATA;

使用类型检查指针的好处是编译器可以告诉您正在执行的操作无效。它知道lpRgnData^.Buffer[0]的类型为Byte,因此@(lpRgnData^.Buffer[0])的类型为^Byte。并且它知道与PChar的{​​{1}}的别名PWideChar不兼容,即^WideChar

通过将PC的类型更改为^BytePByte来修复您的代码。