Autor Beitrag
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 378
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Fr 28.06.13 22:40 
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:

ausblenden 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:
ausblenden 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:

ausblenden 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
Quitzlinga
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2

Win XP
Delphi 2007 Prof. Codegear Win32
BeitragVerfasst: Sa 29.06.13 17:37 
Hi,

versuch es mal mit

Function xy; stdcall; external 'fremde_dll.dll' name 'xy';

MfG

Quitzlinga
GuaAck Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 378
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: So 30.06.13 11:40 
Hallo,

das scheint ein Problem vom Debugger oder der IDE zu sein. Wenn ich die EXE direkt (aus dem Explorer heraus) starte, läuft alles einwandfrei. Im Debug-Mode sieht es so aso, als ob das niedrigste Byte des 4-Byte-Sprungoffsets im CALL keinen Einflss hat. Wenn ich eines der anderen Bytes ändere, dann ändert sich auch der Sprung. Sehr merkwürdig, aber denoch, mein eigentliches Problem ist gelöst und hatte seine Ursache in einem falsche Aufrufparameter. Da hat mich die IDE/Debugger einfach auf eine falsche Fährte gebracht.

Gruß
GuaAck