我刚开始学习 WinAPI,我偶然发现了函数的不同变量。
现在我正在为 ReadProcessMemory
苦苦挣扎。
代码是:
ReadProcessMemory(phandle, (LPVOID)address, &value , sizeof(value), 0);
现在我明白第一个参数是进程的句柄,但我不明白为什么第二个参数(指向基地址的指针)必须是地址的 void (LPVOID
) .
在 MSDN 中它说: 指向指定进程中要从中读取的基地址的指针。在发生任何数据传输之前,系统会验证指定大小的基地址和内存中的所有数据是否都可以进行读取访问,如果不可访问,则函数失败。
那么为什么第二个参数必须是 (LPVOID) 地址而不仅仅是地址?
最佳答案
嗯,lpBaseAddress
是……一个地址,所以它的类型应该是一个指针是有道理的。它指向什么类型?我们不知道,而且这个(WinApi)是 C,所以没有模板——因此 void *
。此外,我们不想修改内存,因此 const
是一个很好的措施。
关于您的编辑(为什么要强制转换):这取决于 address
的类型。任何非 volatile
对象指针都可以隐式转换为 void const *
,因此在这种情况下不需要强制转换。不过,我想该地址是一个已知的 integer
常量,在这种情况下,需要 reinterpret_cast
将其转换为指针。这是在此处使用 C 风格转换的糟糕风格完成的,但实现了相同的效果。
关于C++ WinAPI 读取进程内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47459679/