Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Speicher auslesen mit Delphi (https://www.delphipraxis.net/88694-speicher-auslesen-mit-delphi.html)

simjoh 19. Mär 2007 15:14


Speicher auslesen mit Delphi
 
Hallo,

bin relativer Neuling was Delphi betrifft. Ich spiele manchmal bei PartyPoker Poker. PartyPoker erstellt in einer Textdatei eine Handhistory der gepielten Hände in einem Verzeichnis auf C:\... Nun möchte ich beim Spielen den Speicher von Partypoker auslesen, um mir ein eigenes Programm zu schreiben, welches als Handhistory-Ticker dient. Es soll also in einem TPanel der aktuelle Zug eines Spielers realtime angezeigt werden. Wie macht man sowas?? So eine Handhistory von PartyPoker sieht dann etwas so aus:

Game #5682398962 starts.

#Game No : 5682398962
***** Hand History for Game 5682398962 *****
$0.25/$0.50 Texas Hold'em - Friday, February 16, 23:59:11 ET 2007
Table Table 126428 (Real Money)
Seat 10 is the button
Total number of players : 9
Seat 1: Chipmunk75 ( $13.95 )
Seat 2: gary133 ( $20.63 )
Seat 3: MrChips__ ( $13.70 )
Seat 6: nutsplayer1 ( $25.45 )
Seat 7: ede3006 ( $13.25 )
Seat 8: johann22111 ( $2.43 )
Seat 9: javabung ( $14.40 )
Seat 10: RecluceTM ( $14.85 )
Seat 4: Jojo ( $12.50 )
Chipmunk75 posts small blind [$0.10].
gary133 posts big blind [$0.25].
** Dealing down cards **
MrChips__ folds
nutsplayer1 folds
ede3006 folds
johann22111 calls [$0.25]
RecluceTM folds
Chipmunk75 folds
gary133 checks
** Dealing Flop ** [ Ad, Kc, Ah ]
gary133 checks
johann22111 checks
** Dealing Turn ** [ 6c ]
gary133 checks
johann22111 checks
** Dealing River ** [ 7d ]
gary133 checks
johann22111 bets [$0.50]
emday111 has joined the table.
>You have options at Table 126408 Table!.
gary133 calls [$0.50]
johann22111 shows [ 7s, Qs ]two pairs, Aces and Sevens.
gary133 doesn't show [ 4c, Ts ]a pair of Aces.
johann22111 wins $1.55 from the main pot with two pairs, Aces and Sevens.

Ich kenne mich mit handle, FindWindow und ReadProcessMemory nicht genug aus, kann jemand helfen oder Tipps geben??

Schanke dön!!

shmia 19. Mär 2007 17:11

Re: Speicher auslesen mit Delphi
 
Zitat:

Zitat von simjoh
Nun möchte ich beim Spielen den Speicher von Partypoker auslesen...

Schwierig! Die kleinste Änderung in der Partypoker SW bewirkt, dass dein Programm die Informationen nicht mehr findet.
Wenn die PP SW seine Daten dynamisch im Speicher anlegt (und davon ist auszugehen), sind die Daten jedesmal an einer anderen Adresse.
Wenn du natürlich weisst, an welcher Adresse die Daten stehen und wie die Struktur der Daten ist, kann man was machen.
Es ist auf jeden Fall ein Job für einen Profi; ein Anfänger beisst sich daran die Zähne aus.

simjoh 20. Mär 2007 15:38

Re: Speicher auslesen mit Delphi
 
Hallo,

danke für deine Antwort. Es gibt bereits ein Programm, was das, was ich programmieren möchte kann: FreePHG (http://www.jukofyork.com/freephg.htm). Kann man kostenlos runterladen. Ist aber in C++ geschrieben und ich kann kein C++. Möglich ist das Ganze also. Wenn ich den Code einigermaßen richtig verstehe, wird auch nur das Pokerfenster gesucht (FindWindowByTitle), die ProzessID gesucht und mit ReadProcessMemory der Speicher ausgelesen. Ich weiß aber nicht, wie der weiterverarbeitet wird, dachte eigentlich, dass hier schon ein oder mehrere Strings stehen.

function FindWindowByTitle(WindowTitle: string): Hwnd;
var
NextHandle: Hwnd;
NextTitle: array[0..255] of char;
begin
// Get the first window
NextHandle := GetWindow(Application.Handle, GW_HWNDFIRST);
while NextHandle > 0 do
begin
// retrieve its text
GetWindowText(NextHandle, NextTitle, 255);
if Pos(WindowTitle, StrPas(NextTitle)) <> 0 then
begin
Result := NextHandle;
Exit;
end
else
// Get the next window
NextHandle := GetWindow(NextHandle, GW_HWNDNEXT);
end;
Result := 0;
end;

procedure TForm2.Button7Click(Sender: TObject);
var
WindowName : integer;
ProcessId : integer;
ThreadId : integer;
buf : PChar;
HandleWindow : Integer;
write : cardinal;
const
v1 = $90;
begin
WindowName := FindWindowByTitle('Table');{FindWindow(nil,WindowT itle);}
If WindowName = 0 then MessageDlg('...erst spiel starten...dann programm starten =)', mbwarning,[mbOK],0);
ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);
GetMem(buf,1);
buf^ := Chr(v1);
FreeMem(buf);
closehandle(HandleWindow);
end;

Wie wird buf^ weiterverarbeitet??

Grüße


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz