- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码用于使用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/
以下代码用于使用Delphi 2007编译: constructor TMyFile.Create(const _Filename: string); begin inherited Create
我有一个从 THandleStream 派生的简单类,我用它来编辑原始卷。我调用 Windows createfile() 函数来打开驱动器,但该函数永远不会返回有效句柄,而是返回一个奇怪的错误代码(
我是一名优秀的程序员,十分优秀!