64位辅助函数Handle64toHandle()

时间:2013-01-30 15:19:20

标签: c 64-bit 32bit-64bit

尝试使用MSVC 64位编译器解决以下代码的逻辑错误。

此代码以前在32台机器上运行良好。

return ((ULONG) DupThreadHandle);

在64位世界中,我了解到任何线程句柄都是64位(实际上是6byte),所以这段代码显然是错误的,因为目标类型是ULONG,它是32位。

但msdn建议使用helper函数,我在标题中提到了64位移植C代码,包括basetsd.h

但我的问题是,这样的辅助函数在概念上如何将6字节地址更改为4字节地址?因为已将线程放在某个6字节的地址处。这个4字节地址有多大意义? 我不想改变目的地类型。因为问题会是递归警告。

1 个答案:

答案 0 :(得分:2)

根据微软here,...

  

为了便于移植,已经做出了这些系统的决定   句柄应保持为32b值,符号扩展到64b上的64b   平台。也就是说,各个句柄类型仍然基于   HANDLE类型,映射到void *,因此句柄的大小是   指针的大小,即32b上的4个字节和64b上的8个字节。   但是,64b平台上的句柄的实际值(即   有意义的位),适合低32b,而高位只是   带着标志。

另见this

Handle64toHandle()函数的效果可以通过简单地在64位和32位类型之间进行转换来复制,但是......这是BIG BUT .....你必须使用{{1类型。如上所述,使用signed类型的演员表将微软对地址的处理视为签名数量。将您的演员表更改为使用unsigned类型,您应该没问题。但是您需要确保以signed 32位类型存储任何此类地址,以便稍后将它们正确地转换回正确的64位类型,而不会丢失顶部位的全1状态。如果由于遗留原因无法做到这一点(即将它们存储在32位无符号整数中,而这些整数是您无法更改的遗留代码的一部分),那么请务必转换这些无符号值在将转换回到64位时返回有符号的值。