![]() |
Funktionsaufruf von C nach Delphi übersetzen
Moin,
ich habe Schwierigkeiten, eine C-DLL aus Delphi (Win32) heraus anzusprechen. Ich habe zu der DLL eine Header-Datei, von der ich annehmen kann, dass sie korrekt ist. In der Header-Datei sind zum Einen Strukturen (struct) definiert, die ich in packed records überführt habe und die Typen anhand einschlägiger Dokumentation übersetzt habe. Da sind auch wenig schräge Sachen dabei gewesen, es ging um char* -> PChar, double -> Double und long -> Longint, teilweise auch als Arrays. Nun verbleiben noch drei Funktionsdeklarationen, die vom strukturellen Aufbau der identisch sind, daher hier nur einer dieser Aufrufe als Beispiel:
Code:
ich habe daraus das Folgende in Delphi gemacht:
extern void __declspec (dllexport) FUNKTIONSNAME(datentyp1*,datentyp2*,long*);
Delphi-Quellcode:
Bedauerlicherweise bekomme ich nur eine Schutzverletzung aus der DLL. Ich gehe davon aus, dass meine Daten nicht richtig in der DLL ankommen, da die DLL selbst mit einer ganzen Reihe an Plausibilitäts-Prüfungen versehen ist. Wenn ich also in den Datenstrukturen Felder falsch initialisiere, so sollte ich Fehlercodes erhalten, aber keine Schutzverletzung.
procedure(var _1 : datentyp1; var _2: datentyp2; var _3: LongInt) cdecl;
Irgtendwelche Ideen zu meiner Übersetzung? |
Re: Funktionsaufruf von C nach Delphi übersetzen
aus meiner Sicht völlig korrekt übersetzt. An welcher Adresse beim lesen/schreiben von welcher Adresse kommt die AV?
|
Re: Funktionsaufruf von C nach Delphi übersetzen
hm. Danke für die Bestätigung meiner Übersetzung. Aber Deine Frage nach der Adresse könnte auf die Ursache meines Problems hinweisen.
Zitat:
*seufz* Na gut, dann schaue ich mal, was ich hier tun könnte. :-) |
Re: Funktionsaufruf von C nach Delphi übersetzen
Probier stdcall statt cdecl. Die C Deklaration ist nicht eindeutig, da Projektoptionen die Calling Convention veraendern koennen.
Es ist bei C Deklarationen nicht erkennbar ob man "datentyp * param1" zu "var Param1: datentyp" oder "param1: Pdatentyp" uebersetzen soll. Nur die Dokumentation kann da helfen. Ein Zeiger kann in C Call-by-reference oder Zeiger auf den Beginn eines Arrays bedeuten. Nur die Dokumentation kann da helfen. "long *" deutet aber ein "var Param3: Longint" an und die uebliche Bedeutung das man eine Arraylaenge darin platziert und der Aufruf dann mit der Anzahl ausgefuellter Array-Elemente zurueckkommt. Zeig mal wie du die Funktion aufrufst. |
Re: Funktionsaufruf von C nach Delphi übersetzen
Zitat:
|
Re: Funktionsaufruf von C nach Delphi übersetzen
Du sollt die Loesung nicht an den Haaren herbeiziehen!
|
Re: Funktionsaufruf von C nach Delphi übersetzen
Zitat:
Kann alles ein, muss aber nicht |
Re: Funktionsaufruf von C nach Delphi übersetzen
das schreiben an Adresse 0 deutet wirklich darauf hinn das du einen Pointer ins nichts übergibst oder deine Struktur irgendwo einen Pointer ins nichts hat obwohl da ein Pointer auf Speicher erwartet wird.
Oftmals hilft es dann das CPU-Debug-Window mit einzuschalten und dann in die DLL rein zu steppen. |
Re: Funktionsaufruf von C nach Delphi übersetzen
Moin Zusammen,
Zitat:
Zitat:
Zitat:
(er lässt ja auch herbeiziehen ;-)) Zitat:
Zitat:
|
Re: Funktionsaufruf von C nach Delphi übersetzen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 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 by Thomas Breitkreuz