delphi - 为什么在 Delphi XE2 64 位中 HKEY_ 常量为 "Constant expression violates subrange bounds"?

标签 delphi winapi 64-bit delphi-xe2

当我在Delphi XE2中为目标平台64位Windows编译以下代码时...

function HKeyToString(_HKey: HKey): string;
begin
  case _HKey of
    HKEY_CLASSES_ROOT: result := 'HKEY_CLASSES_ROOT'; // do not translate
    HKEY_CURRENT_USER: result := 'HKEY_CURRENT_USER'; // do not translate
    HKEY_LOCAL_MACHINE: result := 'HKEY_LOCAL_MACHINE'; // do not translate
    HKEY_USERS: result := 'HKEY_USERS'; // do not translate
    HKEY_PERFORMANCE_DATA: result := 'HKEY_PERFORMANCE_DATA'; // do not translate
    HKEY_CURRENT_CONFIG: result := 'HKEY_CURRENT_CONFIG'; // do not translate
    HKEY_DYN_DATA: result := 'HKEY_DYN_DATA'; // do not translate
  else
    Result := Format(_('unknown Registry Root Key %x'), [_HKey]);
  end;
end;

...我收到每个 HKEY_-Constants 的警告: “W1012 常量表达式违反子范围边界”

我检查了 Winapi.Windows 中的声明(在标识符上按 Ctrl+左键单击):

type
  HKEY = type UINT_PTR;
{...}
const
  HKEY_CLASSES_ROOT     = HKEY(Integer($80000000));

这些对我来说看起来不错。为什么编译器仍然认为有问题?

最佳答案

在 64 位编译器上,HKEY_CLASSES_ROOT 的实际值为:

FFFFFFFF80000000

这是因为转换为 Integer 会使 80000000 变成负数。然后转换为无符号会导致 FFFFFFFF80000000。请注意,该值是正确的。 windows头文件中的声明是:

#define HKEY_CLASSES_ROOT (( HKEY ) (ULONG_PTR)((LONG)0x80000000) )

当您在 C++ 程序中包含头文件并检查 HKEY_CLASSES_ROOT 的值时,它与 Delphi 声明的值完全相同。

然后我们可以从 Delphi 文档中解决这个难题,该文档指出 selectors in a case statement can only be :

any expression of an ordinal type smaller than 32 bits

您别无选择,只能将 case 语句替换为 if 语句。

关于delphi - 为什么在 Delphi XE2 64 位中 HKEY_ 常量为 "Constant expression violates subrange bounds"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14647108/

相关文章:

excel - 在 Excel 2013 中输入 64 位整数

delphi - 如何在Windows中获取任何文件的关联图标(.ICO)并在Delphi中显示所有图标图像大小?

algorithm - 在 Delphi 中快速填充字符串

c++ - 我如何使用 SendInput 在 x、y 坐标上模拟鼠标双击窗口(我知道 handle )?

c - 在 C 中以 64 位整数存储值

ios - Core Image 人脸检测在 64 位 iOS 上损坏了吗?

delphi-7 - 将 BS(退格键)发送到 TMemo

php - 使用 Delphi TidHttp 抓取时检测客户端重定向

windows - 在本地 NTFS 驱动器上查找回收站

c++ - 控制台 - WinAPI - 颜色