1

在 C++ 中,我可以简单地将指针转换为 DWORD 吗?

MyClass * thing;
DWORD myPtr = (DWORD)thing;

那行得通吗?

4

4 回答 4

6

在 Windows 中,以这种方式传递指针是很常见的,例如在 Windows 消息中。LPARAM 是 LONG_PTR 的 typedef,并且经常用于将指针传递给某些结构。您应该reinterpret_cast<DWORD_PTR>(thing)用于铸造。

于 2014-01-03T23:34:29.467 回答
6

毫无疑问,你可以做到。

它是否会起作用将取决于环境以及您希望它做什么。

在 32 位 Windows 1(最常见的地方DWORD)上,它通常没问题。在 64 位 Windows 上(您也可以看到DWORD,但几乎看不到那么多)它通常不会。


  1. 或者,更准确地说,当编译为将作为 32 位进程运行的 32 位可执行文件时,无论您碰巧在哪个 Windows 的实际副本上运行它。
于 2014-01-03T23:34:39.897 回答
4

不,在 64 位进程中,指针是 64 位,但 DWORD 只有 32 位。使用 DWORD_PTR。

于 2014-01-03T23:31:46.190 回答
1

http://en.cppreference.com/w/cpp/language/explicit_cast

阅读,理解,避免 C 风格的转换,因为它们隐藏了很多。

这样做可能可以完成,但没有任何意义,例如 DWORD 是 4 个字节,而指针(现在)是 8 个。

reinterpret_cast<DWORD&>(myPtr);

应该可以工作,但它可能是未定义的或被截断的,如果有什么可以工作的话!

顺便说一句,reinterpret_cast是 C++ 表达“相信我,亲爱的编译器,我知道我在做什么”的方式——它试图将一件事的位(0 和 1)解释为另一件事,不管这有多大意义。

一个合法的用途是著名的 1/sqrt hack ;)

于 2014-01-03T23:33:41.013 回答