以下用于使用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吗?
答案 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
不存在,您必须弄清楚条件应该是什么。