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

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Fr 15.02.19 00:55 
Hallo,

ich steuere mein Oszi von einem Delphi-Programm aus, der Hersteller des Oszis hat ein gut brauchbares Software-Development-Kit (SDK) zur Verfügung gestellt. Kern ist eine mitgelieferte *.DLL und Header-Dataien in C++ (oder C). Ich hatte kein Problem, die Header-Dateien in Delphi umzusetzen, und es läuft. U. a. kann ich vom PC aus alle Einstellungen für das Oszi aus einer Datei laden und per USB an das Oszi senden.

Jetzt die Merkwürdigkeit: Nach der Übertragung machte ich bisher einen MessageDlg auf mit "...erfolgreich..." oder "... Fehler.."; ging. Jetzt wollte ich im Erfolgsfall lieber eine Zeile in ein TMemofeld schreiben (Memo1.Lines.Add('...erfogreich...')), da gibt es aber eine "access violation" . Das ebenso, wenn ich eine andere Methode/Procedure (alles innerhalb der Klasse des Hauptfensters) aufrufe. Ich könnte es bei MessageDlg belassen, aber es beunruhigt, wenn so eine Merkwürdigkeit auftritt.

Ich habe gelesen, dass Delphi von externen Funktionen erwartet, dass die Register EBX, ESI, EDI, EBP und ESP nicht verändert bzw. mit Rückkehr restauriert sind. Mit der CPU-Ansicht habe ich gefunden, dass die DLL-Funktionen das nicht machen.

Nun meine Frage 1: Gibt es auch für DLLs eine Konvention, welche Register unverändert bleiben müssen?

Frage 2: Ich würde jetzt vor jedem Funktionsaufruf aus der DLL selbst per Inline-Assembler die Register auf den Stack schieben und dann später selbst restaurieren. Wird wohl gehen, wäre doch aber ein merkwürdiges Verfahren.

Bin gespannt auf Eure Tipps,

Viele Grüße
GuaAck
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 15.02.19 01:12 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: GuaAck
GuaAck Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: Fr 15.02.19 18:13 
Hallo Frühlingsrolle,

Dein Verdacht war richtig, bei einer Funktion stand im Header ein Paramter zu viel. Wegen der Deklaration "stdcall" muss die aufgerufene Funktion des Stack aufräumen, hat sie dann um einen Parameter zu wenig gemacht, und schon war der Stackpointer verschoben.

Ansonsten habe ich mir mit dem CPU-Fenster vor und nach jedem Funktionsaufruf die Register angesehen, die EBX, ESI, EDI, EBP und ESP sind immer unverändert.

Danke und viele Grüße
GuaAck