gpt4 book ai didi

delphi - THandleStream.Create with INVALID_HANDLE_VALUE 无法编译

转载 作者:行者123 更新时间:2023-12-03 15:57:17 24 4
gpt4 key购买 nike

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

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

在 Delphi XE 中,它失败并出现错误E1012:常量表达式违反子范围边界。

原因是THandleStream.Create的声明:

德尔福 2007:

constructor THandleStream.Create(AHandle: Integer);

德尔福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 吗?

最佳答案

THandleStream.Create 将其句柄参数声明为 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 不存在,您必须计算出真正的条件应该是什么。

关于delphi - THandleStream.Create with INVALID_HANDLE_VALUE 无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8009797/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com