AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein DLL Function fungiert anders als "direkte".
Thema durchsuchen
Ansicht
Themen-Optionen

DLL Function fungiert anders als "direkte".

Ein Thema von gizzy · begonnen am 1. Okt 2008 · letzter Beitrag vom 1. Dez 2008
Antwort Antwort
Benutzerbild von gizzy
gizzy

Registriert seit: 3. Jun 2007
59 Beiträge
 
Delphi 2007 Enterprise
 
#1

DLL Function fungiert anders als "direkte".

  Alt 1. Okt 2008, 20:58
Hi,

ich habe grade folgendes Problem:

1. Folgende Funktion funktioniert ohne Fehler wenn Sie in der gleichen Unit steht.

Delphi-Quellcode:
function get_x(pid: Integer; offset_base: DWord; offset_xreg: Dword = $7C; offset_xpos: DWord = $78; Divider: Double = 10.0): Integer;
var
  xOffsetInt, BaseAddress : DWord;
  xRegionFloatPtr : ^Single;
  xRegionFloat : Single;
  xRegionBase : Longint;
  hProcess : THandle;
  rBytes : Cardinal;
  PositionInt : Smallint;
  lowByte : Byte;
  xreg, xpos : Cardinal;
begin
  xreg := offset_xreg;
  xpos := offset_xpos;

  Try
    hProcess := OpenProcess(PROCESS_VM_READ,False,pid);

    ReadProcessMemory(hProcess, Pointer(offset_base), @baseAddress, SizeOf(dword), rBytes);
    ReadProcessMemory(hProcess, Pointer(baseAddress + xreg), @xOffsetInt, SizeOf(xOffsetInt), rBytes);
    Move(xOffsetInt, xRegionFloatPtr, SizeOf(xOffsetInt));

    xRegionFloat := Single(xRegionFloatPtr);
    xRegionFloat := xRegionFloat / Divider;

    ReadProcessMemory(hProcess, Pointer(baseAddress + xpos), @PositionInt, SizeOf(PositionInt), rBytes);

    lowByte := LOBYTE(PositionInt);
    xRegionBase := lowByte * 3 - $195;
    xRegionBase := xRegionBase shl 6;
    result := Round(xRegionBase+xRegionFloat);
  except
    result:= 0;
  end;
end;
Packe ich diese in meine DLL und rufe sie ab, springt dat ding als in die Exception wegen Gleitkomma Überlauf (Except mal auskommentiert gehabt.)

Ich rufe die auch eig. ganz normal auf :/

Delphi-Quellcode:
const
  pid = 6023;
[..]
Memo1.Lines.Add(IntToStr(get_x(pid, $CF2D94, $7C, $78, 10.0)));
Was mache ich falsch, bzw. was muss ich ändern um das es auch aus der DLL heraus klappt. (Es sollte jedes mal der selbe wert rauskommen).


[edit=SirThornberry]zweite Frage entfernt - Mfg, SirThornberry[/edit]
David
[Fehler] Unit1.pas(1): Dein Kaffee ist kalt.
[Fehler] Unit1.pas(2): Dein linker großer Zeh ist eingeschlafen.
[Fataler Fehler] Projekt1.dpr(5): Verwendete Unit "Unit1.pas" kann nicht comiliert werden.
  Mit Zitat antworten Zitat
Benutzerbild von gizzy
gizzy

Registriert seit: 3. Jun 2007
59 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: DLL Function fungiert anders als "direkte".

  Alt 1. Okt 2008, 21:32
Ok, habe aus Single mal nen Real gemacht. Jetzt scheint es zu funktionieren.
Kann mir einer erklären warum die DLL eine größere Gleitkommazahl brauch?

2. Frage steht noch aus
David
[Fehler] Unit1.pas(1): Dein Kaffee ist kalt.
[Fehler] Unit1.pas(2): Dein linker großer Zeh ist eingeschlafen.
[Fataler Fehler] Projekt1.dpr(5): Verwendete Unit "Unit1.pas" kann nicht comiliert werden.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: DLL Function fungiert anders als "direkte".

  Alt 1. Okt 2008, 21:58
könntest du bitte für deine zweite Frage ein eigenes Thema erstellen?
Und nutze zukünftig innerhalb von 24 Stunden bitte die Edit-Funktion wenn zwischenzeitlich kein anderer etwas gepostet hat
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von gizzy
gizzy

Registriert seit: 3. Jun 2007
59 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: DLL Function fungiert anders als "direkte".

  Alt 1. Okt 2008, 22:03
Sorry wegen doppel post. Hatte nichtmal aktualisiert

Aber hab ja zur meiner Lösung noch ne frage offen
David
[Fehler] Unit1.pas(1): Dein Kaffee ist kalt.
[Fehler] Unit1.pas(2): Dein linker großer Zeh ist eingeschlafen.
[Fataler Fehler] Projekt1.dpr(5): Verwendete Unit "Unit1.pas" kann nicht comiliert werden.
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#5

Re: DLL Function fungiert anders als "direkte".

  Alt 1. Okt 2008, 23:46
Der Code ist echt unsauber programmiert. WinAPIs haben doch Rückgabvewerte auf die man prüfen sollte. Eine Exception kann nur noch bei der Division (durch 0) auftreten. Und wenn du statt einem Single Real nimmst kommt ein ganz anderes ergebnis raus. Das macht absolut keinen Sinn was du da dann machst. Ich denke der Code stammt nicht von dir oder? Du liest außerdem aus einem dynamsichen Speicherbereich die Daten aus, was auch nicht wirklich "sauber" ist.

Irgendwie so würds jetzt umgewandelt aussehen (habs heir im Editor programmiert )

Delphi-Quellcode:
function get_x(pid: Integer; offset_base: DWord; offset: Dword = $7C; Divider: Double = 10.0): Integer;
var
  BaseAddress : DWord;
  xRegionFloat : Single;
  hProcess : THandle;
  rBytes : Cardinal;
  PositionInt : Byte;
begin
  Result := 0;
  if Divider <> 0 then
  begin
    hProcess := OpenProcess(PROCESS_VM_READ,False,pid);
    if hProcess <> 0 then
    begin
      if ReadProcessMemory(hProcess, Pointer(offset_base), @baseAddress, SizeOf(baseAddress), rBytes) and
        (rBytes = SizeOf(baseAddress)) and
        ReadProcessMemory(hProcess, Pointer(baseAddress + offset), @xRegionFloat, SizeOf(xRegionFloat), rBytes) and
      (rBytes = SizeOf(xRegionFloat)) and
        ReadProcessMemory(hProcess, Pointer(baseAddress + offset+4), @PositionInt, SizeOf(PositionInt), rBytes) and
      (rBytes = SizeOf(PositionInt)) then
        result := Round(xRegionFloat / Divider + (PositionInt* 3 - $195) shl 6));
    end;
  end;
end;
Edit:
Du versuchst jetzt nicht seit 7 Monaten einen Cheat/Bot für Silkroad zu erstellen oder ^^
  Mit Zitat antworten Zitat
Benutzerbild von gizzy
gizzy

Registriert seit: 3. Jun 2007
59 Beiträge
 
Delphi 2007 Enterprise
 
#6

Re: DLL Function fungiert anders als "direkte".

  Alt 1. Dez 2008, 09:31
Nein, ich habe die nicht selbst programmiert, da ich nicht wusste wie mann die berechnung der Coordinate durchführt.

Round(xRegionFloat / Divider + (PositionInt* 3 - $195) shl 6)); Auslesen aus dem memory hatte ich auch schon in vorherigen funktion selbst erarbeitet. Da mir die Funktion als ganzes Vorlag habe ich sie so genommen wie Sie war.
Allerdings habe ich sie einwenig geändert. Sie hat funktioniert, von daher..

Übringens, das Ding liegt nicht umsonst in nen Try block, wenn es eine exception gibt kommt eben 0 raus.
Und:
Nein, ich probiere / und habe es nie versucht einen Cheat zu schreiben, ich mache das wenn mir langweilig ist, oder mir auf der Arbeit die Pause um die Ohren zu schlagen.

Zum dynamischen auslesen: Schon klar das es nicht sauber ist, aber es ist nunmal ein Dynamischer Adressbereich vorgegeben. Nur so kann ich meine Werte auslesen die ich haben will.
David
[Fehler] Unit1.pas(1): Dein Kaffee ist kalt.
[Fehler] Unit1.pas(2): Dein linker großer Zeh ist eingeschlafen.
[Fataler Fehler] Projekt1.dpr(5): Verwendete Unit "Unit1.pas" kann nicht comiliert werden.
  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 03:57 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