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

如何解决Delphi错误:不兼容的类型:';PWideChar';和';指针';,delphi,pointers,delphi-xe4,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中正常工作 谢谢是否编译取决于。你显然已经启用了这个选项,这是一个非常好的决定。这样做会导致更严格的类型

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

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

  PC := @(lpRgnData^.Buffer[0]);
在Delphi XE4中,它给出以下编译错误:

Incompatible types: 'PWideChar' and 'Pointer'
如何更新此代码以在XE4中正常工作


谢谢

是否编译取决于。你显然已经启用了这个选项,这是一个非常好的决定。这样做会导致更严格的类型检查

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

现在,让我们来看看有问题的类型。它们在
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;
使用类型检查指针的好处是编译器可以告诉您所做的是无效的。它知道
lprgnda^.Buffer[0]
具有类型
Byte
,因此
@(lprgnda^.Buffer[0])
具有类型
^Byte
。它知道这与
PChar
不兼容,PChar是
PWideChar
的别名,即
^WideChar


通过将
PC
的类型更改为
^Byte
PByte

来修复代码,编译与否取决于设置。你显然已经启用了这个选项,这是一个非常好的决定。这样做会导致更严格的类型检查

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

现在,让我们来看看有问题的类型。它们在
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;
使用类型检查指针的好处是编译器可以告诉您所做的是无效的。它知道
lprgnda^.Buffer[0]
具有类型
Byte
,因此
@(lprgnda^.Buffer[0])
具有类型
^Byte
。它知道这与
PChar
不兼容,PChar是
PWideChar
的别名,即
^WideChar


通过将
PC
的类型更改为
^Byte
PByte
来修复您的代码。看起来您需要将
PChar
更改为
PAnsiChar
。但可能是错误的。缓冲区是字节数组。因此,将PChar改为PByte。@jerrydrodge使用(前unicode)
PChar
处理本应使用的内容
PByte
一开始就让很多遗留代码(像这样)陷入了麻烦。如果您需要字节,最好使用
PByte
,imo.@J..,pre-Unicode PChar是一种固有类型,但PByte不是。因此,自TP时代以来,大多数实现都将PChar用作字节指针。请看。@Jerrydoge:我尝试的第一件事是将PChar更改为PAnsiChar,但这只是将错误消息更改为“不兼容类型:'PAnsiChar'和'Pointer'”。将其更改为PByte才有效。看起来您需要将
PChar
更改为
PAnsiChar
。但可能是错误的。缓冲区是字节数组。因此,将PChar改为PByte。@jerrydrodge使用(前unicode)
PChar
处理本应使用的内容
PByte
一开始就让很多遗留代码(像这样)陷入了麻烦。如果您需要字节,最好使用
PByte
,imo.@J..,pre-Unicode PChar是一种固有类型,但PByte不是。因此,自TP时代以来,大多数实现都将PChar用作字节指针。请看。@Jerrydoge:我尝试的第一件事是将PChar更改为PAnsiChar,但这只是将错误消息更改为“不兼容类型:'PAnsiChar'和'Pointer'”。将其更改为PByte是有效的。