AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Funktionsaufruf von C nach Delphi übersetzen
Thema durchsuchen
Ansicht
Themen-Optionen

Funktionsaufruf von C nach Delphi übersetzen

Ein Thema von Daniel · begonnen am 31. Jul 2007 · letzter Beitrag vom 1. Aug 2007
Antwort Antwort
Seite 1 von 2  1 2      
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#1

Funktionsaufruf von C nach Delphi übersetzen

  Alt 31. Jul 2007, 15:56
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:
extern void __declspec (dllexport) FUNKTIONSNAME(datentyp1*,datentyp2*,long*);
ich habe daraus das Folgende in Delphi gemacht:

procedure(var _1 : datentyp1; var _2: datentyp2; var _3: LongInt) cdecl; 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.


Irgtendwelche Ideen zu meiner Übersetzung?
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Funktionsaufruf von C nach Delphi übersetzen

  Alt 31. Jul 2007, 16:14
aus meiner Sicht völlig korrekt übersetzt. An welcher Adresse beim lesen/schreiben von welcher Adresse kommt die AV?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Funktionsaufruf von C nach Delphi übersetzen

  Alt 31. Jul 2007, 16:26
hm. Danke für die Bestätigung meiner Übersetzung. Aber Deine Frage nach der Adresse könnte auf die Ursache meines Problems hinweisen.
Zitat:
'Access violation at address 1000F624 in module 'TARIF.DLL'. Write of address 00000000' aufgetreten.
Wenn ich jetzt im Hinterkopf habe, dass die Datenstrukturen unter anderem aus PChars bestehen, könnte der Fehler daraus resultieren, dass ich die nicht alle initialisiert habe, weil ich einie für optional hielt. Ich habe zu Anfang ein FillChar( Variable, SizeOf(VariablenTyp), 0 ) drüber laufen lassen.


*seufz* Na gut, dann schaue ich mal, was ich hier tun könnte.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#4

Re: Funktionsaufruf von C nach Delphi übersetzen

  Alt 31. Jul 2007, 16:32
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.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: Funktionsaufruf von C nach Delphi übersetzen

  Alt 31. Jul 2007, 16:38
Zitat von Robert Marquardt:
Zeig mal wie du die Funktion aufrufst.
Vielen Dank für Deine Antwort, ich werde morgen weiteren Code veröffentlichen können, jetzt bin ich auf dem Sprung zu meinem Fris... Hair-Stylisten und zuhause habe ich noch keinen Zugang zum Internet (grummelt auf eine Telefongesellschaft mit einem A am Anfang).
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#6

Re: Funktionsaufruf von C nach Delphi übersetzen

  Alt 31. Jul 2007, 16:40
Du sollt die Loesung nicht an den Haaren herbeiziehen!
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Funktionsaufruf von C nach Delphi übersetzen

  Alt 31. Jul 2007, 16:43
Zitat:
(grummelt auf eine Telefongesellschaft mit einem A am Anfang).
Vorsicht! Manche Telefongesellschaften müssen den Draht zu deiner Wohnung erst von einer anderen TTelefongesellschaft kaufen (bzw. mieten). Und dieses Kauf-Interface hat ne ganze Menge sleeps mit in der Implementation.
Kann alles ein, muss aber nicht
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Funktionsaufruf von C nach Delphi übersetzen

  Alt 31. Jul 2007, 17:10
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#9

Re: Funktionsaufruf von C nach Delphi übersetzen

  Alt 31. Jul 2007, 22:01
Moin Zusammen,

Zitat von Robert Marquardt:
Es ist bei C Deklarationen nicht erkennbar ob man "datentyp * param1" zu "var Param1: datentyp" oder "param1: Pdatentyp" uebersetzen soll.
Nur kann man nichts falsch machen, wenn man bei solchen Parametern grundsätzlich "param1: PDatentyp" nimmt, wohingegen die var-Variante, je nachdem, was als Wert möglich ist, durchaus Probleme machen kann.

Zitat von Daniel:
jetzt bin ich auf dem Sprung zu meinem Fris... Hair-Stylisten
Zitat von Robert Marquardt:
Du sollt die Loesung nicht an den Haaren herbeiziehen!


(er lässt ja auch herbeiziehen )


Zitat von Daniel:
und zuhause habe ich noch keinen Zugang zum Internet (grummelt auf eine Telefongesellschaft mit einem A am Anfang).
Zitat von sirius:
Manche Telefongesellschaften müssen den Draht zu deiner Wohnung erst von einer anderen TTelefongesellschaft kaufen
Die haben halt noch nicht den richtigen Draht zu Dir
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Funktionsaufruf von C nach Delphi übersetzen

  Alt 31. Jul 2007, 22:15
Zitat von Daniel:
Wenn ich jetzt im Hinterkopf habe, dass die Datenstrukturen unter anderem aus PChars bestehen,
Hast du auch Speicher für die PChars reserviert?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz