AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Inkompatible Typen

Ein Thema von Reditus · begonnen am 27. Mär 2008 · letzter Beitrag vom 29. Mär 2008
Antwort Antwort
Reditus

Registriert seit: 27. Mär 2008
Ort: Bremen
5 Beiträge
 
#1

Inkompatible Typen

  Alt 27. Mär 2008, 21:42
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.
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#2

Re: Inkompatible Typen

  Alt 27. Mär 2008, 22:58
Du kannst ja auch nicht einen String mit IntToHex in einen Hexwert umwandeln, du musst schon den String erstmal in einen Integer umwandeln ...
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
xqz93

Registriert seit: 28. Mär 2008
1 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Inkompatible Typen

  Alt 28. Mär 2008, 00:58
Hallo alle zusammen.

Die Variable "Edit1Text" ist als Integer Deklariert

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:
  Buf^ := Chr(('Edit1Text decimal = ''$' + IntToHex(EditText))); Obwohl das glaub ich genau so wenig Sinn macht .

Gruß XQZ
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Inkompatible Typen

  Alt 28. Mär 2008, 04:33
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:

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);
[...]
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#5

Re: Inkompatible Typen

  Alt 28. Mär 2008, 04:55
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);
[...]
  Mit Zitat antworten Zitat
Reditus

Registriert seit: 27. Mär 2008
Ort: Bremen
5 Beiträge
 
#6

Re: Inkompatible Typen

  Alt 28. Mär 2008, 13:02
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!
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Inkompatible Typen

  Alt 28. Mär 2008, 17:21
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Inkompatible Typen

  Alt 28. Mär 2008, 17:28
ACK
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

Re: Inkompatible Typen

  Alt 28. Mär 2008, 17:36
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#10

Re: Inkompatible Typen

  Alt 29. Mär 2008, 00:04
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:32 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