2017-11-23 1 views
0

Ich habe gerade angefangen zu lernen, die WinAPI und ich stolperte über verschiedene Variablen für Funktionen. Gerade jetzt kämpfe ich mit der ReadProcessMemory. Der Code ist:C++ WinAPI ReadProcessMemory

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

Jetzt verstehe ich, dass der erste Parameter ein Handle für den Prozess ist, aber ich verstehe nicht, warum der zweite Parameter (der Zeiger auf die Basisadresse) muss eine Lücke sein (LPVOID) von eine Adresse.

In MSDN heißt es: Ein Zeiger auf die Basisadresse im angegebenen Prozess von dem gelesen werden soll. Bevor eine Datenübertragung stattfindet, überprüft das System, ob alle Daten in der Basisadresse und im Speicher der angegebenen Größe für den Lesezugriff zugänglich sind, und wenn die Funktion nicht zugänglich ist, schlägt die Funktion fehl.

Also warum muss es sein (LPVOID) Adresse und nicht nur Adresse für den zweiten Parameter?

+1

LPVOID ist ein Zeiger auf eine Lücke. I.e. ein 'void *'. –

+0

Warum denkst du davon aus, dass es erforderlich ist? – MSalters

Antwort

4

Nun, lpBaseAddress ist ... eine Adresse, so macht es Sinn, dass sein Typ ein Zeiger sein sollte. Auf welchen Typ deutet es? Wir wissen nicht, und das (die WinApi) ist C, also keine Vorlagen - daher die void *. Wir wollen auch nicht den Speicher ändern, so ist ein const von gutem Maß.

Über Ihre Bearbeitung (warum die Besetzung): Es hängt von der Art der address. Jeder Objektzeiger, der nicht volatile ist, kann implizit in void const * konvertiert werden. In diesem Fall ist die Umwandlung nicht erforderlich. Ich nehme jedoch an, dass diese Adresse eine bekannte integer Konstante ist, in welchem ​​Fall ein reinterpret_cast benötigt wird, um es in einen Zeiger zu verwandeln. Dies geschieht hier mit dem schlechten Stil eines C-Style-Cast, erreicht aber das gleiche.

+0

Vielen Dank Quentin. – DavisR5