Delphi-PRAXiS
Seite 6 von 6   « Erste     456   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Hilfe beim Übersetzten von C in Delphi (https://www.delphipraxis.net/88928-hilfe-beim-uebersetzten-von-c-delphi.html)

simjoh 27. Mär 2007 18:26

Re: Hilfe beim Übersetzten von C in Delphi
 
So, vielleicht keine Erhellung für alle, aber immerhin:

Delphi-Quellcode:
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.
Wie der Speicher jetzt ausgelesen wird, weiß ich noch nicht.

simjoh 30. Mär 2007 07:33

Re: Hilfe beim Übersetzten von C in Delphi
 
Hilfe, komme alleine nicht weiter!!! Wer erbarmt sich??

simjoh 1. Apr 2007 16:22

Re: Hilfe beim Übersetzten von C in Delphi
 
Keiner da, der mir hilft?? Robert?

Robert Marquardt 1. Apr 2007 16:31

Re: Hilfe beim Übersetzten von C in Delphi
 
Alter Mann ist kein D-Zug.
Code:
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 einfach ein String-Vergleich auf '#Game No : 09'. Zur Beschleunigung werden die ersten 4 Bytes in einem Rutsch verglichen.
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.

simjoh 1. Apr 2007 16:36

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

Robert Marquardt 1. Apr 2007 16:56

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). :-)

simjoh 1. Apr 2007 17:06

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:
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;
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:24 Uhr.
Seite 6 von 6   « Erste     456   

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