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
——这可能会产生非常严重的错误