Hallo,
vielleicht hat ja jemand eine Idee zu folgendem Problem:
Ich rufe aus einem einfachen Testprogramm heraus Funktionen aus einer DLL auf. (Quellcode habe ich nicht.) Die DLL binde ich statisch in mein Programm ein, also:
Quelltext
1:
| Function xy; external; 'fremde_dll.dll' name 'xy'; |
Viele Funktionen gehen ohne Problem, aber bei einer erhalte ich eine "Access-Violation". Ich habe mich dann mit dem Debugger und Anzeige CPU-Fenster per F7/F8 schrittweise durch die DLL gehangelt und bin schnell auf folgende Merkwürdigkeit gestoßen, die ich nicht verstehe:
Anzeigen im Delphi-Debugger CPU-Fenster:
Quelltext
1:
| 5981DD8A E8F15FFBFF Call -$0004a00f |
Ich erwartete, dass mit dem nächsten Einzelschritt (F7) der Befehl (5 Byte Code + aktuelle Adresse = Absprungadresse) ausgeführt wird und nach $5981DD8A+5-$0004a00f=$597D3D80 springt. (Da sieht der Code auch sinnvoll aus.) Tatsächlich landet der Sprung aber bei $597D3D5B, also $25 daneben. Da steht Müll und die "Access Violation" ist klar.
Ich war neugierig und habe per HEX-Editor in der DLL-Datei den Sprungoffset etwas geändert (gepatched). Dann sah ich nach Neustart im Delphi-Debugger auch richtig meine Änderung:
Quelltext
1:
| 5981DD8A E8FE05FFBFF Call -$0004a020 (statt vorher ...0f) |
Und nun die Überraschung: Nachdem das Programm per Breakpoint auf diesem Befehl pausierte, lande ich mit dem nächsten Einzelschritt (F7) wieder bei der gleichen Adresse $597D3D5B!!
Hat da jemand eine Erklärung?
Bin gespannt auf Antworten.
Viele Grüße
GuaAck