![]() |
DLL Function fungiert anders als "direkte".
Hi,
ich habe grade folgendes Problem: 1. Folgende Funktion funktioniert ohne Fehler wenn Sie in der gleichen Unit steht.
Delphi-Quellcode:
Packe ich diese in meine DLL und rufe sie ab, springt dat ding als in die Exception wegen Gleitkomma Überlauf (Except mal auskommentiert gehabt.)
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; Ich rufe die auch eig. ganz normal auf :/
Delphi-Quellcode:
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).
const
pid = 6023; [..] Memo1.Lines.Add(IntToStr(get_x(pid, $CF2D94, $7C, $78, 10.0))); [edit=SirThornberry]zweite Frage entfernt - Mfg, SirThornberry[/edit] |
Re: DLL Function fungiert anders als "direkte".
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 :) |
Re: DLL Function fungiert anders als "direkte".
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 :-) |
Re: DLL Function fungiert anders als "direkte".
Sorry wegen doppel post. Hatte nichtmal aktualisiert :)
Aber hab ja zur meiner Lösung noch ne frage offen :D |
Re: DLL Function fungiert anders als "direkte".
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:
Edit:
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; Du versuchst jetzt nicht seit 7 Monaten einen Cheat/Bot für Silkroad zu erstellen oder ^^ |
Re: DLL Function fungiert anders als "direkte".
Nein, ich habe die nicht selbst programmiert, da ich nicht wusste wie mann die berechnung der Coordinate durchführt.
Delphi-Quellcode:
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.
Round(xRegionFloat / Divider + (PositionInt* 3 - $195) shl 6));
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 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