【问题标题】:Cannot convert from uint32_t* to LPDWORD无法从 uint32_t* 转换为 LPDWORD
【发布时间】:2014-01-30 01:14:48
【问题描述】:

我正在尝试调用 Windows API 函数 GetExitCodeProcess,该函数将 LPDWORD 作为其第二个参数。

根据MSDN,LPDWORD 是一个指向无符号 32 位值的指针。所以我尝试传递一个uint32_t*,但编译器(MSVC 11.0)对此并不满意:

错误 C2664:“GetExitCodeProcess”:无法将参数 2 从“uint32_t *”转换为“LPDWORD”

static_cast 也无济于事。这是为什么?在这种情况下使用reinterpret_cast 是否安全?

【问题讨论】:

  • 为什么不使用DWORD,然后再分配回您的uint32_t?
  • DWORD 为 unsigned long,与 unsigned int 不同
  • @stijn:MSDN 说 DWORD 是“一个 32 位无符号整数”。 uint32_t 也是如此。那么有什么区别呢?
  • @Chad:我想我可以做到这一点(现在我使用reinterpret_cast 作为解决方法)。但我想了解这里发生了什么。
  • 区别在于指向 unsigned int 的指针与指向 unsigned long 的指针不同。

标签: c++ winapi casting


【解决方案1】:

来自documentation:

DWORD

一个 32 位无符号整数。范围是 0 到 4294967295(十进制)。 该类型在 IntSafe.h 中声明如下:

typedef unsigned long DWORD;

所以,LPDWORD 是 unsigned long int*。但是您正试图通过unsigned int*。我知道类型指向的变量大小相同,但是指针类型不兼容。

解决方案是声明一个DWORD 类型的变量,并传递该变量的地址。像这样的:

DWORD dwExitCode;
if (!GetExitCodeProcess(hProcess, &dwExitCode))
{
    // deal with error
}
uint32_t ExitCode = dwExitCode;

【讨论】:

  • 我注意到DWORD 被定义为unsigned long,但我没想到编译器会以不同的方式处理unsinged long 和unsigned int,因为它们的大小相同。 - 感谢您的回答!
  • 旁白:我没有质疑您为什么要将退出代码存储在uint32_t 中。就个人而言,我想知道你为什么不只使用DWORD。
  • 区别对待的是指针类型。您可以从 int 分配到 long ,反之亦然。但不适用于int* 和long*。
  • 我正在编写一个函数,它启动一个进程,等待该进程完成,然后返回其退出代码。我将使用相同的接口为 Windows 和 Linux 实现该功能。这就是为什么我没有在我的函数签名中使用 Windows 特定的 typedef(当然,我可以在 Windows 实现中使用你的解决方案)。
  • @RobertHegner 因为它们具有相同的大小 只是这样想,例如:在 32 位进程中,32 位浮点数和指向类的指针也是大小相同,但编译器显然会禁止您将一个分配给另一个。大小无关紧要,类型很重要。
猜你喜欢
  • 2013-09-17
  • 1970-01-01
  • 2018-04-30
  • 2017-08-14
  • 1970-01-01
  • 2012-05-25
  • 2023-04-01
  • 2018-02-24
  • 2014-07-23
相关资源
最近更新 更多