Autor Beitrag
jan_d
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 29.07.10 17:42 
Die Aufgabe war eine PC-Digitizer-Karte von Agilent zu Steuern. Dazu wird von Agilent eine Reihe DLL's zur Verfügung gestellt.
Nach dem Aufruf von jeder Funktion bekam ich immer eine Exception-Medlung: EZeroDivide - Floating Point Division by Zero. Da ich dafür keine schnelle Lösung fand habe ich die Applikation in VB6 geschrieben - damit hat es zuverlässig funktioniert.
Ich muss trotzdem eine Lösung für Delphi finden weil das Projekt soll weiter geführt werden und VB auf Dauer ist dafür nicht einsetzbar.
Umgebung: Delphi-7, WXP


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Do 29.07.2010 um 21:41
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Do 29.07.10 18:42 
Hall und :welcome:

Welche Dll? Wie schaut der Aufruf aus? So können wir nur raten oder die Glaskugel auspacken... ;)

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
jan_d Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 29.07.10 19:04 
Die Deklaration:
ausblenden Delphi-Quelltext
1:
function Acqrs_getNbrInstruments(var nbrInstruments: integer): integer; stdcallexternal 'AqDrv4.dll' name '_Acqrs_getNbrInstruments@4';					

der Aufruf:
ausblenden Delphi-Quelltext
1:
2:
3:
var   instr_count, ag_result: integer;

  ag_result := Acqrs_getNbrInstruments(instr_count);

Solange KEINE Digitizer Karte in den Rechner steckt wird der Aufruf korrekt ausgeführt und liefert 0 als Anzahl der verfügbaren Geräte und 0 als korrekte Funktionsausführung. Wird die Karte gesteckt kommt nach dem Aufruf EZeroDivide - wohl gemerkt nicht von der DLL sondern von Delphi-Applikation. Das gleiche abläuft mit anderen Aufrufen. Die DLL's verwenden FP-Unit - kann es dabei vielleicht zu einem Konflikt mit Delphi kommen? Außer Windows-API habe ich bisher mit keinen 'fremden' DLL's gearbeitet deswegen fühle ich mich dabei ziemlich ratlos...

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 29.07.10 20:39 
Klar ist: In dem Code, den du gepostet hast, kann der Fehler nur in der Funktion in der DLL auftreten. Vermutlich liegt der Fehler an einer anderen Stelle im Code.

Hast du denn einmal mit dem Debugger geschaut in welcher Zeile der Fehler auftritt? Und welche Werte die Variablen dort haben? Etc.
jan_d Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 29.07.10 22:43 
Debugger bleibt an der DLL-Aufrufzeile stehen und öffnet Fenster mit Prozessorregister. Für den Test habe ich den Aufruf ohne weiteres Code unter einem 'click' eingebaut. Das Spiel ist also irgendwo zwischen Delphi und der DLL....
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 30.07.10 05:31 
Nicht dazwischen, dann passiert die Exception in der DLL. Beim Aufruf passiert ja von Delphi aus nix weiter.

Du kannst ja auch einfach nen Haltepunkt setzen und mit Strg + Alt + C vor dem Aufruf in das CPU-Fenster wechseln. Dann kannst du im Assemblercode schauen was passiert.

Andere Möglichkeit: Hast du irgendwelche Callbacks oder Messages, die aus der DLL kommen? Dann kann nämlich ganz woanders Code von dir ausgeführt werden.