1

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

这段代码之前在 32 台机器上运行良好。

return ((ULONG) DupThreadHandle);

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

但是 msdn 建议使用我在标题中提到的帮助函数,通过包含 basetsd.h 对 C 代码进行 64 位移植

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

4

1 回答 1

2

根据微软在这里,...

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

另请参阅,.

Handle64toHandle() 函数的效果可以通过简单地在 64 位和 32 位类型之间进行转换来复制自己,但是……这是 BIG BUT……你必须使用signed类型进行转换。unsigned如上所述,您使用类型的强制转换会阻碍 Microsoft 将地址视为有符号数量的处理方式。更改您的投射以使用signed类型,您应该没问题。但是您需要确保将任何此类地址存储在signed32 位类型,以便稍后将它们正确转换回正确的 64 位类型,而不会丢失最高位的全为状态。如果您由于遗留原因不能这样做(即将它们存储在一个 32 位无符号整数中,这是您无法更改的遗留代码的一部分),那么请确保在进行转换时将这些无符号值转换回有符号值回到 64 位。

于 2013-01-30T17:06:13.967 回答