【问题标题】:C++ Pointer as DWORDC++ 指针作为 DWORD
【发布时间】:2014-01-21 18:27:53
【问题描述】:

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

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

这行得通吗?

【问题讨论】:

  • 不,你想要uintptr_t
  • 好吧,您的代码在 32 位进程中是可以的。为什么要将指针填充到 DWORD 中?
  • @DavidHeffernan 我正在查看我使用 ReadProcessMemory 从另一个进程复制的指针。我需要获取该指针的值,以便可以从该指针指向的其他进程读取数据。
  • 那个细节需要在Q里
  • 所以这个问题不是关于选角的吗? stackoverflow.com/a/20914668/2112028 完全没有意义? OP是否尝试过运行它?我完全误解了吗?

标签: c++ pointers casting dword


【解决方案1】:

你无疑可以做到。

它是否会起作用将取决于环境和你想要它做什么。

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


  1. 或者,更准确地说,当编译为将作为 32 位进程运行的 32 位可执行文件时,无论您碰巧在哪个 Windows 的实际副本上运行它。

【讨论】:

  • 如果进程构建为 32 位进程,DWORD 可以工作吗?
  • 你可能已经知道答案了——Visual Studio (Win32) 32位编译器的默认配置是什么?
  • @ChristianStewart:是的。您可以创建 64 位可执行文件,但它不是(还)默认设置。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这不取决于进程是32位还是64位?
    • 是的,但在这种情况下,64 位窗口上的 32 位进程等同于 32 位窗口上的 32 位进程。
    【解决方案4】:

    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 ;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 2016-07-12
      • 2021-10-05
      • 1970-01-01
      相关资源
      最近更新 更多