![]() |
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. |
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 ...
|
Re: Inkompatible Typen
Hallo alle zusammen.
Die Variable "Edit1Text" ist als Integer Deklariert :!:
Delphi-Quellcode:
An dieser stelle kommt bei mir dieser Fehler:
buf^ := Chr(('Edit1Text decimal = ''$' +IntToHex(Edit1Text, 1));
Code:
Statt desen würde ich es so Probieren:
[DCC Fehler] Unit1.pas(51): E2250 Es gibt keine überladene Version von 'IntToHex', die man mit diesen Argumenten aufrufen kann
Delphi-Quellcode:
Obwohl das glaub ich genau so wenig Sinn macht :|.
Buf^ := Chr(('Edit1Text decimal = ''$' + IntToHex(EditText)));
Gruß XQZ |
Re: Inkompatible Typen
Zitat:
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:
Momentan machst Du da nämlich folgendes:
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); "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:
Dazu sei gleich noch gesagt:
buf^ := Chr(StrToInt(Edit1Text));
- 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); [...] |
Re: Inkompatible Typen
Mit diesen Funktionen wird es recht einfach:
![]()
Delphi-Quellcode:
var
hex, daten : string; begin hex := '00FF00FEA0B000'; // Beispieldaten daten := HexStringToStr(hex); // umwandeln [...] WriteProcessMemory(HandleWindow, Pointer(Address), PChar(daten), Length(daten), write); [...] |
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! |
Re: Inkompatible Typen
Zitat:
|
Re: Inkompatible Typen
ACK
|
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 |
Re: Inkompatible Typen
Zitat:
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 02:32 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