Autor Beitrag
AndrewPoison
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17


Turbo Delphi 2006, Delphi 2009
BeitragVerfasst: Sa 30.08.08 10:25 
Manche Spiele wie GTR2 z.B. besitzen ein SharedMemory, in welchem die Games Daten hinterlegen die andere Programme aufrufen und nutzen können. Bei GTR2 geht es z.B. so, dass GTR2 in den SharedMemory die aktuelle Geschwindigkeit, Motordrehzahl etc. etc. schreibt und die Software G-Racer das ganze dann auf die G15 bringt.

Nun, wie man für die G15 programmiert weiss ich, aber nicht wie ich auf den SharedMemory komme (in diesem Fall von GTR Evolution). Es steht ja auch nirgends ne Adresse oder dergleichen, wo genau man eigentlich "hin muss" im Speicher.

Wie gesagt, hab das noch nicht gemacht, würde aber gerne für GTR Evo ein G15-Applet und einiges mehr programmieren, nur komm ich halt nicht an die Daten rann. Dementsprechend würdes mir auch erstmal reichen, wenn man mich irgendwohin verlinkt, wo es vlt. speziell um den Zugriff für GTR Evo geht. Wie lauten die Funktionen (ReadProcessMemory kenne ich, aber wie lauten dann die Parameter?) dafür?
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 30.08.08 13:28 
Shared-Memory-Bereiche haben einen Namen, den man mit z.B. dem Process Explorer oder anderen POrogrammen abfragen kann. Danach nur noch den Speicher im eigenen Prozess mappen und drauf zugreifen.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
AndrewPoison Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17


Turbo Delphi 2006, Delphi 2009
BeitragVerfasst: Sa 30.08.08 14:27 
So weit so gut. Habe mir im Process Explorer von SysInternals mal die zugehörige Exe-Datei angeschaut, während das Programm im Hintergrund lief. Wo dort allerdings der Name des Shared Memory zu finden ist... keine Ahnung :D

Ich kann lediglich abfragen, ob und wieviel Shared Memory vorhanden ist, nicht wie dieser heisst.


/edit:

habe mir grade das Lower Pane im Process Explorer anzeigen lass, dort finden sich SECTIONs (\BaseNamedObjects\$Race$) und MUTANTs (\BaseNamedObjects\RACE 07_APP_MUTEX_) - von beiden gibts ne ganze Menge, auch viele ohne Bezeichnung. Könnte das dass richtige sein? Oder gucke ich mir grade das falsche an?

Wenn ja, wie wäre in diesem Fall der Code um zu prüfen welche Daten sich darin befinden (nur um sicherzugehen, dass mein eigener Code nicht schon fehlerhaft ist)?

/edit2:

mit folgendem Code hab ich erstmal ein Handle bekommen:

ausblenden 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:
30:
var
 hMapFile: Thandle;
 szName: PChar;
 retn: PChar;
 TPN: Pointer;
begin
  // \BaseNamedObjects\RACE 07_APP_MUTEX_
  // \BaseNamedObjects\$Race$

  szName := '$Race$';
  hMapFile := OpenFileMapping(FILE_MAP_READ,FALSE,szName);
  if hMapFile <> 0 then
  begin
    Label1.Caption := 'We Got The Handle!';
    TPN := MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,256);
    ShowMessage(IntToStr(GetLastError));
    if TPN <> nil then
    begin
     Memo1.Text := String(@TPN);
    end
    else
    begin
     Label1.Caption := 'Oh no!';
    end;
  end
  else
  begin
    Label1.Caption := 'Daaamn...';
  end;
end;


So hab ichs jetzt erstmal zum testen gemacht. Im Memo steht allerdings nachher nichts, das Label zeigt mir aber weder ein "oh no" noch "daaamn" an, sondern das "we got the handle"... also sollte der Zugriff doch im Grunde gefunzt haben?

Ist halt nachwievor die Frage, ob ich überhaupt auf das richtige Objekt zugreife. Damit verbunden bleibt die Frage: wie bekomm ich zweifelsfrei den Namen der Shared Memory-Region heraus?


Zuletzt bearbeitet von AndrewPoison am Sa 30.08.08 15:10, insgesamt 1-mal bearbeitet
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Sa 30.08.08 15:09 
TPN ist in deinem Fall bereits ein Pointer.

Deklarier Dir eine Variable PB: PByte (ältere Delphi-Versionen ^Byte) und lass Dir dort z.B. 4096 Bytes Hexadezimal ausgeben.

Alternativ: Gib Dir mit Format('%p', TPN) die Adresse aus, warte mit Sleep 120 Sekunden und begutachte den Speicherbereich z.B. mit HxD oder einem anderen Hex-Editor, der in den Prozess-Speicherbereich anderer Prozesse schauen kann.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
AndrewPoison Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 17


Turbo Delphi 2006, Delphi 2009
BeitragVerfasst: Sa 30.08.08 15:47 
Ich hab mir mal angeschaut, was in dem Speicherbereich steht: nichts. Und noch praktischer: der Wert ändert sich jedes Mal, wenn ich mir ein Handle zuweisen lasse. Und mal steht da über mehrere KB nichts, bei nem anderen Handle ist mal was zu sehen, aber das ist nicht der Rede Wert.

Also entweder ist noch prinzipiell an meinem "Aufbau" was verkehrt oder es ist nicht die korrekte Map.

/edit: vor ein paar Tagen hats dann geklappt, indem ich eine Klasse und eine darauf zeigende Klasse gebastelt habe. Die Daten standen dann in der Klasse drinnen. Im Grunde hat der obige Quelltext damit funktioniert, nur das standardmäßige Auslesen hat nicht hingehaun. Thema damit erledigt ;)