C++ 无法从uint32_t*转换为LPDWORD

C++ 无法从uint32_t*转换为LPDWORD,c++,winapi,casting,C++,Winapi,Casting,我正在尝试调用Windows API函数GetExitCodeProcess,它将LPDWORD作为第二个参数 根据,LPDWORD是指向无符号32位值的指针。因此,我试图传递一个uint32\u t*,但编译器(MSVC 11.0)对此不满意: 错误C2664:“GetExitCodeProcess”:无法将参数2从“uint32\u t*”转换为“LPDWORD” 另外,static\u cast也没有帮助。为什么呢?在这种情况下,使用重新解释投射是否安全?来自: DWORD 32位无符号整

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

根据,
LPDWORD
是指向无符号32位值的指针。因此,我试图传递一个
uint32\u t*
,但编译器(MSVC 11.0)对此不满意:

错误C2664:“GetExitCodeProcess”:无法将参数2从“uint32\u t*”转换为“LPDWORD”

另外,
static\u cast
也没有帮助。为什么呢?在这种情况下,使用
重新解释投射是否安全?

来自:

DWORD

32位无符号整数。范围为0到4294967295十进制。 此类型在IntSafe.h中声明如下:

typedef unsigned long DWORD;
因此,
LPDWORD
无符号长整型*
。但是您正在尝试传递
无符号int*
。我知道这些类型指向大小相同的变量,但指针类型不兼容

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

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

为什么不使用一个
DWORD
,然后将其分配回您的
uint32\u t
?DWORD是无符号长的,这与无符号不同int@stijn:MSDN表示,
DWORD
是“一个32位无符号整数”。
uint32\u t
也是如此。那么有什么区别呢?@Chad:我想我可以这样做(现在我正在使用
重新解释\u cast
作为解决办法)。但我想了解这里发生了什么。区别在于指向无符号整型的指针不同于指向无符号长型的指针。我注意到,
DWORD
被定义为
unsigned long
,但我没想到编译器会对
unsigned long
unsigned int
进行不同的处理,因为它们的尺寸一样谢谢你的回答!旁白:我不是在质疑为什么要将退出代码存储在
uint32\t
中。就我个人而言,我想知道为什么不直接使用DWORD,而是指针类型被区别对待。您可以从int分配到long,反之亦然。但不适用于
int*
long*
。我将使用相同的界面在Windows和Linux上实现该功能。这就是为什么我没有在函数签名中使用Windows特定的typedef(但我当然可以在Windows实现中使用您的解决方案)。@RobertHegner因为它们具有相同的大小,所以请这样想,例如:在32位进程中,32位浮点和指向类的指针也具有相同的大小,然而,编译器显然会禁止您将一个指定给另一个。大小不一致;这里不重要,类型重要。