C++ 如何在不引发警告的情况下正确使用ReadProcessMemory

C++ 如何在不引发警告的情况下正确使用ReadProcessMemory,c++,windows,winapi,memory,readprocessmemory,C++,Windows,Winapi,Memory,Readprocessmemory,使用ReadProcessMemory的正确方法是什么 我目前的使用方式如下: DWORD read_mem(DWORD addr) { DWORD buffer = 0x0; if (!ReadProcessMemory(phandle, LPCVOID(addr), &buffer, sizeof(DWORD), nullptr)) { return false; } return buffer; } 由于addr被错误浇铸

使用
ReadProcessMemory
的正确方法是什么

我目前的使用方式如下:

DWORD read_mem(DWORD addr)
{
    DWORD buffer = 0x0;
    if (!ReadProcessMemory(phandle, LPCVOID(addr), &buffer, sizeof(DWORD), nullptr))
    {
        return false;
    }

    return buffer;
}
由于
addr
被错误浇铸,这会导致警告

warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
我见过的其他示例代码(如)使用相同的方法

那么,在没有警告的情况下使用此函数的正确方法是什么?

“从不同大小的整数转换为指针”-这意味着
DWORD
void*
是不同的字节大小,只有在编译64位代码时才会发生这种情况,因为它们在32位编译中具有相同的字节大小

从MSDN文档中,可以看到:

德沃德
32位无符号整数。范围为0到4294967295十进制

一个
DWORD
根本不够大,无法容纳64位内存地址(您提到的同样也只能在32位内存中正常工作)

Addr
(以及用于确定
Addr
值的任何代码)改为使用
DWORD\u PTR

DWORD_PTR
指针精度的无符号长类型。将指针强制转换为长类型以执行指针算术时使用。(也常用于在64位窗口中扩展到64位的常规32位参数。)


然后,无论编译为32位还是64位,
Addr
都将是正确的字节大小。

Ad地址将是指针。你为什么决定用德沃德?你明白这个警告吗?如果不是,为什么在理解警告之前询问解决方案?“你是想理解,还是只想有人帮你写程序。@大卫·费弗南对不起,如果措辞错误,我不是以英语为母语的人。我在问这里最好用哪种类型。例如,您可以使用
INT\u PTR
作为地址,但这是正确的选择吗?我会使用指针表示需要使用
PVOID
的指针,或者如果需要对其进行算术运算(添加、比较)-
PBYTE
ULONG\u PTR
。您的警告,因为不同的大小。有时,当需要将DWORD转换为指针时,需要使用2种类型的强制转换来避免警告-
(PVOID)(ULONG_PTR)(d)
。在
basetsd.h
中查找实现。但是,需要非常注意符号扩展或零扩展4字节
DWORD
到8字节
PVOID
——这可能会产生非常严重的错误