![]() |
Re: Hilfe beim Übersetzten von C in Delphi
Das C-Programm ist ein Konsolenprogramm. Da sind Parameter auf der Kommandozeile voellig normal.
Welche steht wahrscheinlich nur in der Dokumentation. Da koennen wir schlecht helfen wenn wir noch nicht einmal wissen was dieses Programm genau tut. |
Re: Hilfe beim Übersetzten von C in Delphi
Haaaaaaaaaallo Robert,
das Prog macht folgendes: Ich spiele manchmal und aus Spaß ein bischen Poker, bin gelernter Mathematiker und interessiere mich daher für die Wahrscheinlichkeiten bei diesem Spiel. Es gibt eine Software, FreePHG, kann man auch kostenlos runterladen auf ![]() Game #5783806449 starts. #Game No : 5783806449 ***** Hand History for Game 5783806449 ***** $0.50/$1 Texas Hold'em - Monday, March 19, 01:45:53 ET 2007 Table Table 126468 (Real Money) Seat 2 is the button Total number of players : 6 Seat 1: CintaIkan ( $4.62 ) Seat 2: Garnbold ( $23 ) Seat 3: TUMERMORIN ( $36.59 ) Seat 4: freddYharps ( $30 ) Seat 5: nickmazda ( $27 ) Seat 6: hottarru ( $56.75 ) TUMERMORIN posts small blind [$0.25]. freddYharps posts big blind [$0.50]. ** Dealing down cards ** nickmazda folds hottarru folds CintaIkan folds Garnbold calls [$0.50] TUMERMORIN calls [$0.25] freddYharps checks ** Dealing Flop ** [ 7d, Th, 2d ] TUMERMORIN checks freddYharps bets [$0.50] Garnbold calls [$0.50] TUMERMORIN calls [$0.50] ** Dealing Turn ** [ 8h ] TUMERMORIN checks freddYharps checks Garnbold bets [$1] TUMERMORIN calls [$1] freddYharps folds ** Dealing River ** [ 6d ] TUMERMORIN checks Garnbold bets [$1] TUMERMORIN calls [$1] Garnbold shows [ 8c, 2s ]two pairs, Eights and Twos. TUMERMORIN doesn't show [ 7h, 3c ]a pair of Sevens. Garnbold wins $6.50 from the main pot with two pairs, Eights and Twos. Ich möchtet realtime ebenfalls den Speicher auslesen, deshalb übersetz ich das Prog FreePHG in Delphi, die Strings müssen nicht in einen Datei geschrieben werden, sondern ich möchte jeden String auf einem TPanel ausgeben. Geht sowas? Liebe Grüße Markus |
Re: Hilfe beim Übersetzten von C in Delphi
Liste der Anhänge anzeigen (Anzahl: 1)
Ach so, hier ist der gepackte Quellcode:
|
Re: Hilfe beim Übersetzten von C in Delphi
Lieber Robert,
wärst du so nett und könntest mir bei diesem Projekt helfen? Ich habe den Code vollständig in Delphi übertragen, bis auf die von dir bisher noch nicht bearbeiteten Fragen von mir. Der Compiler compilierts auch, ich habe aber den Verdacht, dass man das nicht so einfach machen kann. Wäre nett, wenn ich noch was von dir lernen könnte. |
Re: Hilfe beim Übersetzten von C in Delphi
Liste der Anhänge anzeigen (Anzahl: 1)
Ach so, hier meine bisherige übersetzte Unit:
|
Re: Hilfe beim Übersetzten von C in Delphi
Hallo Robert,
was meinst du, hilftste mir? |
Re: Hilfe beim Übersetzten von C in Delphi
Mal sehen wie ich Zeit und Lust habe.
|
Re: Hilfe beim Übersetzten von C in Delphi
Liste der Anhänge anzeigen (Anzahl: 1)
Super, danke. Ich hab nochmal den C-Code in eine Textdatei kopiert.
Herzliche Grüße Markus |
Re: Hilfe beim Übersetzten von C in Delphi
Teilerfolg,
hab die ProcessID, den WindowClassName und das WindowHandle der exe ermittelt. Zugriff auf den Speicher klappt noch nicht. Ich poste morgen mal den Quellcode. |
Re: Hilfe beim Übersetzten von C in Delphi
Hallo,
wie übersetzt man den
Code:
in Delphi?
if ((*((unsigned int*)(&Buffer[I]))) == ((((unsigned int)'m')<<24)
|(((unsigned int)'a')<<16) |(((unsigned int)'G')<<8) |(((unsigned int)'#'))) // Remember: big-endian... && Buffer[I+4]=='e' && Buffer[I+5]==' ' && Buffer[I+6]=='N' && Buffer[I+7]=='o' && Buffer[I+8]==' ' && Buffer[I+9]==':' && Buffer[I+10]==' ' && Buffer[I+11]>='0' && Buffer[I+11]<='9') |
Re: Hilfe beim Übersetzten von C in Delphi
So, vielleicht keine Erhellung für alle, aber immerhin:
Delphi-Quellcode:
Wie der Speicher jetzt ausgelesen wird, weiß ich noch nicht.
unit UnitPHG;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls,{ ShellAPI,} TLHelp32; type TForm1 = class(TForm) Button1: TButton; PLiveTicker: TPanel; PPartyWindowProcessID: TPanel; Label1: TLabel; PPartyWindowClassName: TPanel; PPartyWindowHandle: TPanel; Label2: TLabel; Label3: TLabel; Panel1: TPanel; Label4: TLabel; PPartyWindowExe: TPanel; Label5: TLabel; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } WM_ENUMERATE_ID: integer; public { Public-Deklarationen } procedure WriteText(Wnd: HWnd); procedure WndProc(var Message: TMessage); override; end; var Form1: TForm1; // get a messageID from Windows function RegisterMessage: integer; // this is the callbackfunction. Don't miss stdcall // can't be part of the form. function EnumWinProc(Wnd: HWnd; param: lParam): boolean; stdcall; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin // get our msgID WM_ENUMERATE_ID:= RegisterMessage; end; function RegisterMessage: integer; begin Result:= RegisterWindowMessage('Enumerate this Window'); end; function EnumWinProc(Wnd: HWnd; param: lParam): boolean; stdcall; var iMsgID: integer; begin iMsgID:= RegisterMessage; // give data to main form SendMessage(param, iMsgID, 0, Wnd); Result:=true; end; procedure TForm1.WndProc(var Message: TMessage); begin if Message.Msg=WM_ENUMERATE_ID then // oh! Enumerate Window found a window, lets do something WriteText(Message.lParam) else inherited WndProc(Message); end; //fill in the listview with all the information procedure TForm1.WriteText(Wnd: HWnd); var pcWinText : PChar; Str: string; aProcessEntry32 : TProcessEntry32; aSnapshotHandle : THandle; WinVersion : DWord; ProcessID : longint; ContinueLoop : boolean; begin {WindowCaption ermitteln} pcWinText:= StrAlloc(102); GetWindowText(Wnd, pcWinText, 100); if Pos('PartyPoker.com:',StrPas(pcWinText))<>0 then begin Panel1.Caption:=StrPas(pcWinText); StrDispose(pcWinText); {WindowClassName ermitteln} pcWinText:= StrAlloc(102); GetClassName(Wnd, pcWinText, 100); PPartyWindowClassName.Caption :=StrPas(pcWinText); StrDispose(pcWinText); {WindowHandle ermitteln} PPartyWindowHandle.Caption :=IntToHex(wnd, 8); {WindowThreadProcessID} GetWindowThreadProcessID(wnd,@ProcessID); PPartyWindowProcessID.Caption:=IntToHex(ProcessID, 8); {Weiter: Speicher auslesen: GetMemoryList(ProcessID);} end; {According to Christian Kästner: Bestimmt die exe-Datei} aSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); aProcessEntry32.dwSize := Sizeof(aProcessEntry32); ContinueLoop := Process32First(aSnapshotHandle, aProcessEntry32); while integer(ContinueLoop) <> 0 do begin if aProcessEntry32.th32ProcessID = ProcessID then PPartyWindowExe.Caption:=(ExtractFileName(aProcessEntry32.szExeFile)); ContinueLoop := Process32Next(aSnapshotHandle,aProcessEntry32); end; CloseHandle(aSnapshotHandle); {end of Chrstian's stuff} end; procedure TForm1.Button1Click(Sender: TObject); begin // start EnumerateWindows, send the Handle of the Form // so function nows where to send the info EnumWindows(@EnumWinProc, self.Handle); end; end. |
Re: Hilfe beim Übersetzten von C in Delphi
Hilfe, komme alleine nicht weiter!!! Wer erbarmt sich??
|
Re: Hilfe beim Übersetzten von C in Delphi
Keiner da, der mir hilft?? Robert?
|
Re: Hilfe beim Übersetzten von C in Delphi
Alter Mann ist kein D-Zug.
Code:
Das ist einfach ein String-Vergleich auf '#Game No : 09'. Zur Beschleunigung werden die ersten 4 Bytes in einem Rutsch verglichen.
if ((*((unsigned int*)(&Buffer[I]))) == ((((unsigned int)'m')<<24)
|(((unsigned int)'a')<<16) |(((unsigned int)'G')<<8) |(((unsigned int)'#'))) // Remember: big-endian... && Buffer[I+4]=='e' && Buffer[I+5]==' ' && Buffer[I+6]=='N' && Buffer[I+7]=='o' && Buffer[I+8]==' ' && Buffer[I+9]==':' && Buffer[I+10]==' ' && Buffer[I+11]>='0' && Buffer[I+11]<='9') Das ist allerdings nicht wirklich noetig. Ein normaler String-Vergleich mit Pos sollte es auch tun. Ich habe viel zu tun, daher verliere ich immer mal wieder die Lust mich um diesen Thread zu kuemmern. Tritt mich mal zu Ostern. |
Re: Hilfe beim Übersetzten von C in Delphi
Hallo Robert,
das ist nett, wieder von dir zu hören, momentan scheinst du der Einzige zu sein, der mir helfen kann. Danke, dass du dich kümmerst. Ich trete dich wann immer du willst :-D Hättest du denn mal Lust, dass gesamte Programm mit mir durchzugehen? Ich hänge beim Auslesen des Speichers :wall: Ich würde dann ein bischen C lernen, für dich spränge nicht soooo viel raus, ausser das gute Gefühl, mir geholfen zu haben!! Liebe Grüße und bis Ostern Markus |
Re: Hilfe beim Übersetzten von C in Delphi
Das gute Gefuehl reicht ja. Braeuchte ich mehr wuerde ich dieses Forum ja garnicht besuchen.
C lernen ist immer gut. Wer nur Delphi kann ist doch bei einigen Konzepten unterbelichtet. Viel zu viele hier verstehen bei Pointern und PChar nur Bahnhof. Pointer sind nicht boese, sondern nur anspruchsvoll. C hilft auch sehr wenn man C#- oder Java-Sourcen lesen will. Sorry, ich will nur mal wieder ein bischen laestern. Es gilt auch heute noch "Real Programmers don't use Pascal" (auch wenn man selbst mit Pascal die schoensten Sauereien programmieren kann). :-) |
Re: Hilfe beim Übersetzten von C in Delphi
Jo, stimmt. Ich hab halt mal Delphi "unterrichtet", das eignet sich für die "Lehre" imo besser als C. Prima, dass du mir hilfst. Danke. Ich versuche momentan mal wenigsten etwas aus dem Speicher zu lesen und verwende dazu:
Delphi-Quellcode:
Lasse ich das laufen, kommt eine Exception: EOutOfMenory, Zu wenig Arbeitsspeicher. Zumindest kann ich schon mal "Zeichen" aus dem Speicher lesen, allerdings nicht die, die ich eigentlich suche.
procedure SearchInMemory(PID: Cardinal; sSearchString: WideString);
var hProcess : Cardinal; MemBasicInfo : TMemoryBasicInformation; SysInfo : TSystemInfo; lpMinAddr: Pointer; ret : DWORD; sBuffer : WideString; lpReadBytes : DWORD; lPos : Integer; CalcAddress : DWORD; ByteContent : array of Byte; lpOldProtect: Cardinal; i : Integer; cmpstring : widestring; begin hProcess := OpenProcess(PROCESS_ALL_ACCESS, false, PID); GetSystemInfo(SysInfo); lpMinAddr := SysInfo.lpMinimumApplicationAddress; while Cardinal(lpMinAddr) < Cardinal(SysInfo.lpMaximumApplicationAddress) do begin Application.ProcessMessages; ret := VirtualQueryEx(hProcess, lpMinAddr, MemBasicInfo, SizeOf(MemBasicInfo)); VirtualProtectEx(hProcess,lpMinAddr,MemBasicInfo.RegionSize, PAGE_READWRITE, lpOldProtect); SetLength(sBuffer, MemBasicInfo.RegionSize); if ret = SizeOf(MemBasicInfo) then if ((MemBasicInfo.Type_9 = MEM_PRIVATE) Or (MemBasicInfo.Type_9 = MEM_MAPPED) OR (MemBasicInfo.Type_9 = MEM_IMAGE)) AND (MemBasicInfo.State = MEM_COMMIT) THEN begin ReadProcessMemory(hProcess, lpMinAddr,@sBuffer[1],MemBasicInfo.RegionSize, lpReadBytes); if pos(sBuffer,sSearchString) > 0 then begin CalcAddress := Cardinal(lpMinAddr) + pos(sBuffer,sSearchString); Form1.Memo1.Lines.Add(inttohex(CalcAddress,8)); end; end; VirtualProtectEx(hProcess,lpMinAddr,MemBasicInfo.RegionSize, lpOldProtect, lpOldProtect); lpMinAddr := Ptr(Cardinal(MemBasicInfo.BaseAddress)+MemBasicInfo.RegionSize); end; CloseHandle(hProcess); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz