Entwickler-Ecke

Windows API - ReadProcessMemory(): Typen müssen übereinstimmen


theevilworm - Mi 20.06.12 01:56
Titel: ReadProcessMemory(): Typen müssen übereinstimmen
Ich gebe auf, stundenlanges Googlen hat mir nicht zeigen können, wo der Fehler liegt. Ich habe den Code identisch zu einem funktionierenden Beispiel geschrieben, aber bei mir muckt der Parser bei der markierten Zeile rum:


Quelltext
1:
[Fehler] Unit1.pas(35): Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen                    



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var
  Form1: TForm1;
  ProcessID, WindowName, processhandle: Integer;
  charhp: dword;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
WindowName := FindWindow(NIL,'SRO_Client');
GetWindowThreadProcessID(WindowName,@ProcessID);
ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessID);
ReadProcessMemory(ProcessHandle, ptr($1388CA58), @CharHP, SizeOf(CharHP), 0);
edit1.text:=IntToStr(CharHP);
end;


Welcher Typ stimmt denn nicht mit dem von ReadProcessMemory() erwarteten überein?


bummi - Mi 20.06.12 06:02

Syntaktisch korrigiert, inhaltlich habe ich meine Zweifel.

Delphi-Quelltext
1:
2:
3:
4:
5:
  processhandle,read: Cardinal;
  charhp: dword;
......
......
ReadProcessMemory(ProcessHandle, ptr($1388CA58), @CharHP, SizeOf(CharHP), read);


theevilworm - Mi 20.06.12 09:00

Vielen Dank, das funktioniert! Kannst du mir bitte kurz erklären, wo mein Fehler lag, also warum Cardinal statt Integer akzeptiert wird?
Inhaltlich macht das Programm nichts böses, ich lese nur Werte aus dem Speicher, aber schreibe keine. Das ist kein GameTrainer oder Bot, sondern soll mir diverse Werte außerhalb des Spiels anzeigen und eventuell später an Androidgeräte senden können.


Nersgatt - Mi 20.06.12 09:50

user profile icontheevilworm hat folgendes geschrieben Zum zitierten Posting springen:
Vielen Dank, das funktioniert! Kannst du mir bitte kurz erklären, wo mein Fehler lag, also warum Cardinal statt Integer akzeptiert wird?

ReadProcessMemory schreibt in den letzten Parameter irgendwas rein. Das geht natürlich nur, wenn Du beim letzten Parameter eine Variable (bummi: "read") übergibst. Du hast aber eine Konstante (0) übergeben. Das war der "Hauptfehler".

Edit: gerade mal in der Doku nachgeschaut. Statt einer Variable hättest Du auch nil übergeben können.