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

How to properly use ReadProcessMemory without raising warnings

正确的使用方法是什么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]

我见过的其他示例代码,例如 this 使用相同的方法。

那么在没有收到警告的情况下使用此功能的正确方法是什么?

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

来自 MSDN 文档,Windows Data Types

DWORD
A 32-bit unsigned integer. The range is 0 through 4294967295 decimal.

A DWORD 根本不足以容纳 64 位内存地址(您提到的 other code 同样只能在 32 位中正常工作)。

Addr(以及您用来确定 Addr 值的任何代码)更改为使用 DWORD_PTR

DWORD_PTR
An unsigned long type for pointer precision. Use when casting a pointer to a long type to perform pointer arithmetic. (Also commonly used for general 32-bit parameters that have been extended to 64 bits in 64-bit Windows.)

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