我有来自Delphi 7的这段代码:
var
lpRgnData: PRgnData;
PC: PChar;
PR: PRect;
...
PC := @(lpRgnData^.Buffer[0]);
在Delphi XE4中,它给出了以下编译错误:
Incompatible types: 'PWideChar' and 'Pointer'
如何更新此代码以在XE4中正常工作?
由于
答案 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
的类型更改为^Byte
或PByte
来修复您的代码。