Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Inkompatible Typen (https://www.delphipraxis.net/111005-inkompatible-typen.html)

Reditus 27. Mär 2008 21:42


Inkompatible Typen
 
Hey!
Ich schonwieder!
Ich brauche eure Hilfe ... um den "WriteProcessMemory" benutzen zu können muss der Wert den ich schreiben will in Hexadecimal stehen!
Jetzt habe ich das glaube ich geschafft kann es aber nicht kompilieren. Error = Inkompatible Typen ! Was kann ich tun?

Delphi-Quellcode:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;
                                                 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;

    procedure Button1Click(Sender: TObject);
   private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
        Var WindowName : integer;
            ProcessId : integer;
            ThreadId : integer;
            buf : PChar;
            HandleWindow : Integer;
            write : cardinal;
            Edit1Text : Integer;

   Const WindowTitle = '3D-Pinball für Windows - Space Cadet';
              Address = $C0AEBA;
              Address2 = $A93C9C;
              //Edit1Text = $32;
              NumberOfBytes = 1;





procedure TForm1.Button1Click(Sender: TObject);
begin

 WindowName := FindWindow(nil,WindowTitle);
     If WindowName = 0 then
       begin
             MessageDlg('The game must be running in the background. Run it now, and then try again.', mtwarning,[mbOK],0);
       end;

  ThreadId := GetWindowThreadProcessId(WindowName,@ProcessId);
  HandleWindow := OpenProcess(PROCESS_ALL_ACCESS,False,ProcessId);

  GetMem(buf,1);
  buf^ := Chr(('Edit1Text decimal = ''$' +IntToHex(Edit1Text, 1)); //Hier ist die Stelle wo ich den Wert aus der Edit Box als Hex einfügen möchte
  WriteProcessMemory(HandleWindow,ptr(Address),buf,NumberOfBytes,write);
  FreeMem(buf);
  closehandle(HandleWindow);

end;


end.

MrKnogge 27. Mär 2008 22:58

Re: Inkompatible Typen
 
Du kannst ja auch nicht einen String mit IntToHex in einen Hexwert umwandeln, du musst schon den String erstmal in einen Integer umwandeln ...

xqz93 28. Mär 2008 00:58

Re: Inkompatible Typen
 
Hallo alle zusammen.

Die Variable "Edit1Text" ist als Integer Deklariert :!:

Delphi-Quellcode:
buf^ := Chr(('Edit1Text decimal = ''$' +IntToHex(Edit1Text, 1));
An dieser stelle kommt bei mir dieser Fehler:
Code:
[DCC Fehler] Unit1.pas(51): E2250 Es gibt keine überladene Version von 'IntToHex', die man mit diesen Argumenten aufrufen kann
Statt desen würde ich es so Probieren:
Delphi-Quellcode:
  Buf^ := Chr(('Edit1Text decimal = ''$' + IntToHex(EditText)));
Obwohl das glaub ich genau so wenig Sinn macht :|.

Gruß XQZ

OldGrumpy 28. Mär 2008 04:33

Re: Inkompatible Typen
 
Zitat:

Zitat von Reditus
Hey!
Ich schonwieder!

Ja, DU schon wieder!

Erklär mal bitte im Detail, was Du mit den folgenden drei Zeilen zu tun beabsichtigst. Momentan sieht das nämlich eher aus wie Hand in den Mixer stecken.

Delphi-Quellcode:
  GetMem(buf,1);
  buf^ := Chr(('Edit1Text decimal = ''$' +IntToHex(Edit1Text, 1)); //Hier ist die Stelle wo ich den Wert aus der Edit Box als Hex einfügen möchte
  WriteProcessMemory(HandleWindow,ptr(Address),buf,NumberOfBytes,write);
Momentan machst Du da nämlich folgendes:

"Hole ein Byte Speicherplatz und merke die Adresse in buf"
"Schreibe an diese Stelle das Zeichen, dessen ASCII-Wert dem String 'Edit1Text decimal = ''$' +IntToHex(Edit1Text, 1)); entspricht"
"Schreibe das ominöse Zeichen im Zielprozess an die angegebene Stelle"

Zu Zeile zwei ist zu sagen: Das ist ja wohl der denktechnische Obergau :) Erstmal erwartet Chr() eine Zahl als Argument, und nicht irgendwelchen Text. Zum zweiten konvertiert IntToHex wie der Name schon sagt eine ZAHL und keinen Text. Ich vermute mal stark dass Du folgendes wolltest:

Delphi-Quellcode:
buf^ := Chr(StrToInt(Edit1Text));
Dazu sei gleich noch gesagt:
- Es fehlt die Bereichsprüfung (wenn ich da 500 eingebe, macht es BUMM)
- Es empfiehlt sich, TryStrToInt() zu benutzen, damit erspart man sich den try..except Block und der Code sieht übersichtlicher aus.
- Es ist unnötig, sich dynamisch Speicher zu besorgen um den dann per WriteProcessMemory wegzuschreiben. Genauso gut kannst Du Dir statt eines Pointers und GetMem direkt einen Char deklarieren, und dann dessen Adresse an WriteProcessMemory übergeben:

Delphi-Quellcode:
var
  MeinZeichen: Char;
[...]
  WriteProcessMemory(HandleWindow, Pointer(Address), @MeinZeichen, NumberOfBytes, write);
[...]

sx2008 28. Mär 2008 04:55

Re: Inkompatible Typen
 
Mit diesen Funktionen wird es recht einfach:
http://www.delphipraxis.net/internal...ct.php?t=46356
Delphi-Quellcode:
var
  hex, daten : string;
begin
  hex := '00FF00FEA0B000'; // Beispieldaten
  daten := HexStringToStr(hex); // umwandeln
[...]
  WriteProcessMemory(HandleWindow, Pointer(Address), PChar(daten), Length(daten), write);
[...]

Reditus 28. Mär 2008 13:02

Re: Inkompatible Typen
 
Also ich habe eine Edit Box und in dieser Edit Box möchte ich gerne einen Wert eingeben welchen ich dann bei WriteProcessMemory benutzen möchte. Wenn ich diese Zahl in die EditBox eingebe ist sie doch Integer und nicht String oder?
Und um diese Zahl dann mit WriteProcessMemory benutzen zu können muss sie doch in Hexadecimal stehen oder nich?

Also möchte ich den Wert den ich bei der EditBox eingebe in Hex umwandeln und dann schreiben!

Medium 28. Mär 2008 17:21

Re: Inkompatible Typen
 
Zitat:

Zitat von Reditus
Wenn ich diese Zahl in die EditBox eingebe ist sie doch Integer und nicht String oder?
Und um diese Zahl dann mit WriteProcessMemory benutzen zu können muss sie doch in Hexadecimal stehen oder nich?

Wenn ich so ein Grundlagenwissen in einem Beitrag mit schon recht fortgeschrittenen Dingen wie WriteProcessMemory lese, wird mir echt ausgesprochen unwohl. Sehr sehr unwohl.

DeddyH 28. Mär 2008 17:28

Re: Inkompatible Typen
 
ACK

Neutral General 28. Mär 2008 17:36

Re: Inkompatible Typen
 
Hi,

Du solltest etwas wissen. IntToHex gibt dir einen String zurück. Diese Funktion ist nur gedacht um eine Zahl im Hex-System darzustellen. Wenn du in den Speicher schreibst, dann wahrscheinlich (in deinem Fall) keinen Hex-STRING sondern einfach nur einen Wert. Also Ein Byte z.B. $ABCDEF sieht in der Hex-Darstellung (String :!: ) so aus '$ABCDEF' und ist (als nicht WideChar-) String 7 Bytes groß! Das (und wahrscheinlich noch einiges mehr) sollte dir bewusst sein!

Gruß
Neutral General

sx2008 29. Mär 2008 00:04

Re: Inkompatible Typen
 
Zitat:

Zitat von Reditus
Also möchte ich den Wert den ich bei der EditBox eingebe in Hex umwandeln und dann schreiben!

Ja zum Geier in Beitrag #5 steht doch schon alles!!
Du musst doch nur den kleinen Gedankensprung leisten und die Zeile hex := '00FF00FEA0B000'; durch hex := EditHexdaten.Text ersetzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:11 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