带有INVALID_HANDLE_VALUE的THandleStream.Create无法编译

时间:2011-11-04 13:20:03

标签: delphi delphi-2007 delphi-xe2

以下用于使用Delphi 2007编译的代码:

constructor TMyFile.Create(const _Filename: string);
begin
  inherited Create(Integer(INVALID_HANDLE_VALUE)));
  // ...
end;

在Delphi XE中,它因错误而失败 E1012:常量表达式违反了子范围。

原因是THandleStream.Create:

的声明

Delphi 2007:

constructor THandleStream.Create(AHandle: Integer);

Delphi XE2:

constructor THandleStream.Create(AHandle: THandle);

type
  THandle = NativeUInt;

如果我将其更改为

constructor TMyFile.Create(const _Filename: string);
begin
  inherited Create(THandle(INVALID_HANDLE_VALUE)));
  // ...
end;

它汇编了Delphi XE2和Delphi 2007。 在Delphi 2007中,它会引发警告“W1012:常量表达式违反子范围边界”,并在调用Delphi 2007可执行文件时导致运行时错误。

有什么方法可以更改代码,以便它可以在两个Delphi版本中运行而无需使用IFDEFS吗?

1 个答案:

答案 0 :(得分:2)

THandleStream.Create将其handle参数声明为Integer类型(已签名)。 Delphi XE2通过将其声明为THandle(无符号)来更改此设置。我不确定为什么从签名到无签名的更改。很明显,对于64位目标,它必须扩展到64位,但我不确定为什么需要将有符号更改为无符号。

据我所知,没有条件编译就没有办法解决这个问题。

您可以通过声明类似的类型来包含损坏:

type
{$IFDEF XE2_OR_ABOVE}
  THandleCast = THandle;
{$ELSE}
  THandleCast = Integer;
{$ENDIF}

然后在你的电话网站上你会写

inherited Create(THandleCast(INVALID_HANDLE_VALUE)));

请注意,条件XE2_OR_ABOVE不存在,您必须弄清楚条件应该是什么。