将32位值转换为HANDLE

我正在处理一个提供32位自定义句柄的组件,我想用标准的窗口HANDLEtypes来包装它。 在传统组件中,我已经看到了使用以下两种转换方法:

// value is 32-bits auto value = GetCustomHandle(); HANDLE hA = HANDLE(value); HANDLE hB = (void*)(SIZE_T)value; 

hA和hB总是相等吗? 如果不是,在什么情况下呢?

在这种情况下,我认为它们总是相当的,因为:

  1. function和Ctypes的演员没有区别。
  2. HANDLE相当于void *。
  3. void *和SIZE_T的大小在32位系统上是32位,在64位系统上是64位。

谢谢。

就个人而言,我会去与C + +风格演员:

  HANDLE hCPP = reinterpret_cast<HANDLE>(value); 

你可能会得到一个“将窄类型转换为更宽类型”的警告(或者是编译器使用的术语),在这种情况下,表达式应该是:

  HANDLE hCPP = reinterpret_cast<HANDLE>(static_cast<uintptr_t>(value)); 

类型uintptr_t保证是无符号的并且匹配指针的大小。 使用MS定义的类型只会使它更便于移植 – 在Windows软件中通常不是一个大问题,但将代码设置为便携是毫无益处的。