Kann eine C ++ - Headerdatei mit Klassen in eine Delphi-Einheit konvertiert werden?

8

Ich habe eine C ++ * .h Datei mit drei Klassen darin. Die Header-Datei dient zum Zugriff auf eine DLL. Ich habe fast kein C ++ - Wissen. Ich kann mich jedoch erinnern, dass Sie eine * .h-Datei nicht in eine Delphi-Einheit konvertieren können, in der Klassen enthalten sind. Ist das wahr?

Wenn es nicht wahr ist und Klassen in Headerdateien kein Problem darstellen, wie lautet der allgemeine Ansatz zum Konvertieren der Klassen nach Delphi?

    
Nick Hodges 09.07.2014, 15:43
quelle

3 Antworten

3

In dem Sinne, dass Sie die DLL aus Delphi-Code verwenden können? Ja, viel Glück damit. Sie wissen, wie Sie Delphi-Klassen in einer DLL nicht verwenden können, es sei denn, der Client-Code ist in der gleichen Version von Delphi geschrieben, und selbst dann ist es normalerweise eine schlechte Idee, weil die Speicherverwaltung fehlschlägt. C ++ stellt genau das gleiche Problem dar, nur exponentiell schlechter, weil es kein standardisiertes ABI gibt und es gibt alle möglichen Arten von C ++ - sprich Sprache, die Ihnen Probleme bereitet.

Der einzige Weg, um es zuverlässig zu machen, ist eine Schnittstelle, die einen Standard-ABI verwendet. Wenn Sie über die Quelle verfügen, versuchen Sie, eine C-Schnittstelle zu erstellen, die die C ++ - Schnittstelle umschließt. Wenn nicht, fragen Sie die Person, die die DLL geschrieben hat, eine C-Schnittstelle zur Verfügung zu stellen und fragen Sie, wer die Entscheidung getroffen hat, diese DLL zu verwenden, warum Sie eine Drittanbieter-Bibliothek verwenden, für die keine Quelle verfügbar ist. : P

    
Mason Wheeler 09.07.2014, 15:53
quelle
8

C ++ - Klassen sind, genau wie Delphi-Klassen, nicht für binäre Interoperabilität ausgelegt.

Eine Delphi-Klasse kann nur für die Verwendung durch anderen Delphi-Code und dann nur in einem Paket exportiert werden, und nur dann, wenn Laufzeitpakete verwendet werden, und nur dann, wenn alle Module die gleiche Version von Delphi verwenden. In ähnlicher Weise können C ++ - Klassen nur aus einer DLL durch Code importiert werden, der mit derselben Werkzeugkette kompiliert wurde, die die DLL kompiliert hat.

Es ist also nicht möglich, dass Ihr Delphi-Code diese DLL verwendet. Wie ich es sehe, haben Sie die folgenden Möglichkeiten:

  1. Überreden Sie den Lieferanten der DLL, der Bibliothek eine benutzerfreundliche Oberfläche zur Verfügung zu stellen. Zum Beispiel eine einfache funktionale C-Stil-Schnittstelle oder eine COM-Schnittstelle.
  2. Schreiben Sie einen Adapter in C ++, verwenden Sie den gleichen Compiler, der zum Erstellen der DLL verwendet wurde. Das würde bedeuten, dass Sie die Klassen in Ihren Wrapper importieren und sie auf eine Interop-freundliche Weise Ihrem Delphi-Code aussetzen. Auch hier sind einfache C-Stil-Schnittstelle oder COM die offensichtliche Wahl.
David Heffernan 09.07.2014 15:58
quelle
1

Wie bereits in einer früheren Antwort erwähnt, verwendet die Lösung SWIG, um die Pascal-Bindung zu generieren. Ich begann mit der Entwicklung des Pascal-Moduls der SWIG, aber ich hatte keine Zeit, es zu vervollständigen. Grundsätzlich funktioniert es, aber es fehlen alle Testfälle, die in SWIG integriert werden sollen.

Ich habe es in meinen persönlichen Projekten verwendet und konnte eine komplexe Bibliothek als GDAL importieren.

    
user2253074 10.07.2014 08:13
quelle

Tags und Links