Entwickler-Ecke

Windows API - ReadProcessMemory - Float tatsächlichen Var Parameter


sonny2007 - Mi 07.05.14 20:50
Titel: ReadProcessMemory - Float tatsächlichen Var Parameter
Hiho Zusammen,

nach längeren Probieren verzweifle ich bald.

Folgender Fehler gibt mir Delphi XE2 aus.


Delphi-Quelltext
1:
[DCC Fehler] DPS.pas(54): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen                    


so hier dann noch der kleine Testschnipsel...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
procedure TForm1.Button1Click(Sender: TObject);
var
  hWnd: THandle;
  hProc : THandle;
  pId : DWord;
  lBuf : integer;
  Bytesread: DWord;
  adresse : pointer;
  puffer : single;

begin
  // WindowHandle ermitteln
  hWnd := FindWindow('ArenaNet_Dx_Window_Class''Guild Wars 2');
  if hWnd = 0 then
    showMessage ('Cannot find Window.')
  else begin
    //PID
    GetWindowThreadProcessId(hWnd,@pID);
    // Handle OpenProcess
    hProc := OpenProcess(Process_VM_Read,false, pID);
    if hProc = 0 then
      showMessage('Cannot open process.')
    else
      //label1.Caption := FloatToStr(ReadData(hProc,$4455E048));
      ReadProcessMemory(hProc, ptr($4455E048), @puffer, sizeof(puffer), Bytesread); //READ  <---- Fehlerzeile
      label1.Caption := FloatToStr(puffer);
      closehandle(hProc);//close
    end;
end;


Aktuell ist es für mich nicht nachvollziehbar woher dieser Fehler kommt. Bitte um kurze Hilfe.

Vielen Dank im Voraus.

Grüße
s0n


SMO - Mi 07.05.14 23:33

Wenn du dir mal die Deklaration von ReadProcessMemory anschaust, wirst du sehen, dass "Bytesread" kein DWORD sondern SIZE_T sein muss. Ein NativeUInt geht auch, denn das ist SIZE_T letztendlich.

Unter 32 Bit ist ein DWORD (=LongWord / Cardinal) zwar identisch zu SIZE_T, aber nicht unter 64 Bit. DWORD bleibt DWORD, aber SIZE_T richtet sich nach der "Bitness", daher die Inkompatibilität.


jaenicke - Do 08.05.14 00:24

user profile iconSMO hat folgendes geschrieben Zum zitierten Posting springen:
Unter 32 Bit ist ein DWORD (=LongWord / Cardinal) zwar identisch zu SIZE_T, aber nicht unter 64 Bit. DWORD bleibt DWORD, aber SIZE_T richtet sich nach der "Bitness", daher die Inkompatibilität.
Bei einem var Parameter ist das aber auch völlig egal, ob ein Parameter kompatibel ist oder nicht. Es muss exakt der Typ sein, den der Parameter hat, egal ob ein anderer Typ auch kompatibel wäre.


SMO - Do 08.05.14 00:57

Nein, es muss nicht exakt derselbe Typ sein, den der Parameter bei der Deklaration hat.
Im Beispiel von sonny2007 ginge sonst nur SIZE_T, aber DWORD_PTR geht auch, weil sowohl SIZE_T als auch DWORD_PTR quasi nur Aliase für NativeUInt sind.


jaenicke - Do 08.05.14 09:30

Das hattest du im ersten Satz ja geschrieben. Ich wollte nur klarstellen, dass es nicht um die Größe des Typs oder so geht, sondern wirklich rein um die formalen Typen. Das las sich etwas missverständlich.


sonny2007 - Do 08.05.14 10:10

Erst einmal vielen Dank für eure Hilfe. Heute Abend werde ich es testen und gebe dann Rückmeldung.

Grüße
s0n


sonny2007 - Do 08.05.14 18:44

Hiho,

so eben getestet und es funktioniert. Wieso man auf sowas nicht selber kommt :) ....

Nochmals Danke an euch

Grüße
s0n