С++ WinAPI ReadProcessMemory

Я только начал изучать WinAPI и наткнулся на разные переменные для функций. Сейчас я борюсь с ReadProcessMemory. Код:

ReadProcessMemory(phandle, (LPVOID)address, &value , sizeof(value), 0);

Теперь я понимаю, что первый параметр — это дескриптор процесса, но я не понимаю, почему второй параметр (указатель на базовый адрес) должен быть пустым (LPVOID) адреса.

В MSDN сказано: Указатель на базовый адрес в указанном процессе, из которого следует читать. Перед любой передачей данных система проверяет, что все данные в базовом адресе и памяти указанного размера доступны для чтения, и если они недоступны, функция завершается ошибкой.

Так почему же это должен быть адрес (LPVOID), а не просто адрес для второго параметра?


person DavisR5    schedule 23.11.2017    source источник
comment
LPVOID — это указатель на пустоту. т.е. void*.   -  person Mike Vine    schedule 23.11.2017
comment
Почему вы думаете/предполагаете, что это необходимо?   -  person MSalters    schedule 23.11.2017


Ответы (1)


Что ж, lpBaseAddress — это... адрес, поэтому логично, что его тип должен быть указателем. На какой тип указывает? Мы не знаем, а это (WinApi) на языке C, так что никаких шаблонов -- отсюда и void *. Кроме того, мы не хотим модифицировать память, поэтому const будет хорошей мерой.

Насчет вашего редактирования (почему литье): это зависит от типа address. Любой указатель объекта, отличный от volatile, может быть неявно преобразован в void const *, поэтому в этом случае приведение не требуется. Я полагаю, однако, что этот адрес является известной константой integer, и в этом случае reinterpret_cast необходим, чтобы превратить его в указатель. Это сделано здесь с плохим стилем актерского состава C-стиля, но достигается то же самое.

person Quentin    schedule 23.11.2017
comment
Большое спасибо, Квентин. - person DavisR5; 23.11.2017