我刚刚开始学习WinAPI,我偶然发现了函数的不同变量。
现在我正在与ReadProcessMemory
斗争。
代码是:
ReadProcessMemory(phandle, (LPVOID)address, &value , sizeof(value), 0);
现在我明白第一个参数是进程的句柄,但我不明白为什么第二个参数(指向基址的指针)必须是地址的void(LPVOID
)。
在MSDN中它说: 指向要读取的指定进程中的基址的指针。在发生任何数据传输之前,系统会验证基本地址和指定大小的内存中的所有数据是否都可以进行读取访问,如果无法访问,则该函数将失败。
那为什么它必须是(LPVOID)地址而不仅仅是第二个参数的地址?
答案 0 :(得分:4)
嗯,lpBaseAddress
是......一个地址,所以它的类型应该是一个指针是有意义的。它指的是什么类型?我们不知道,这个(WinApi)是C,所以没有模板 - 因此void *
。此外,我们不想修改内存,因此const
是一个很好的衡量标准。
关于你的编辑(演员为何):它取决于address
的类型。任何非volatile
对象指针都可以隐式转换为void const *
,因此在这种情况下,转换是不必要的。不过,我想,该地址是一个已知的integer
常量,在这种情况下需要reinterpret_cast
将其转换为指针。这是在C风格演员表现不佳的情况下完成的,但也是如此。