Thema: Delphi C++ DLL nutzen

Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#4

Re: C++ DLL nutzen

  Alt 30. Nov 2007, 09:32
Hi,
an sich findest Du in mittels Forensuche schon jede Menge zu dem Problem. An sich kannst Du aus Delphi heraus beliebige DLLs nutzen. DLLs werden nach einer bestimmten Spezifikation erzeugt, die es eben erlaubt, dass man die aus beliebigen Sprachen heraus aufrufen kann.
Das Problem ist dann dabei, dass Unterschiedliche Sprachen auch unterschiedliche Konstrukte anbieten. An sich fragt Luckie schon nach C oder C++, weil C++ Elemente verwenden kann, die Du nicht in ein Delphi-Pendand überführen kannst. Also im Prinzip geht das wohl schon, aber praktisch wäre es recht sinnfrei. So gibt es in C++ u.A. Templates, Strukturen deren Elemente nur eine bestimme Anzahl von Bits belegen, einen anderen Aufbau von Klassen usw.
An sich gibt es 3 Möglichkeiten, die man unterscheiden muss:
1. Die C++-DLLs basieren auf Borlands C++, wurden also z.B. auch durch das BDS erzeugt. Da ist dann (afaik) die Kompatibilität gegeben, soweit ich weiß sogar was statisch gebundene Files angeht (sicherlich auch mit geringen Einschränkungen)
2. Die C++-DLLs wurden mit einem anderen Compiler übersetzt und verwenden Elemente, die es so nicht in Delphi gibt (ganz schlecht, nicht wirklich gut nutzbar)
3. Die C++-DLLs wurden als "C-DLLs" gebaut (häufiger der Fall).

Auf den dritten Punkt (der so nicht ganz stimmt) möchte ich kurz näher eingehen. C++ compiler erzeugen immer C++ Code, gar keine Frage. Die Adressen von Funktionen werden in C++ anders berechnet als in C, man hatte/hat aber natürlich C++ immer unter dem Aspekt entwickelt, dass man möglichst komfortabel auch auf C-Code zurückgreifen kann. Hier besitzt C++ die Möglichkeit, dass man Funktionen nach dem "alten" C Prinzip benennt und somit eben auch für ein C-Programm verfügbar macht. Auch mit Klassen sieht es ähnlich aus, die gibt es einfach nicht in C. Trotzdem gibt es Momente wo C und C++ Code gemischt werden soll (z.B. wenn eine C-Vermittlung verwendet werden muss). Jedenfalls gibt es hier die Möglichkeit, dass man Code erzeugt, der intern zwar aus C++ besteht und sogar auf Klassen als Funktionsparameter zurückgreift, nach außen aber über eine C-Schnittstelle verwendbar ist. Klassen stehen dabei eben nur innerhalb der C++-Funktionen als solche zur Verfügung, nach außen hat man nur einen Zeiger auf etwas (i.d.R. eine Struktur ohne Elemente).
DLLs die in C++ geschrieben werden, setzen häufig solche Mechanismen ein um die Kompatibilität (die immer gewünscht ist) möglichst hoch zu halten. Das gleiche gilt übrigens nicht nur für C++, auch Java (mittels JNI) geht einen ählichen Weg und in Delphi-DLLs sollte man auch nur einfache Routinen und Strukturen verwenden, damit diese DLL auch durch C/C++ u.A. nutzbar ist.
An sich bietet es sich immer an, dass man die C-Kompatibilität sucht. Der einfache Grund dafür, C setzt sich aus wenigen und zudem recht einfachen Elementen zusammen. Diese findet man in fast jeder Sprache und damit ist das der kleinste gemeinsame Nenner (häufig auch schon der Größte).

Wenn Du eine DLL hast, die in C oder C++ geschrieben wurde, so liegt meistens auch eine Header-Datei (.h) bei, der kann man dann leicht entnehmen ob die DLL auch für Delphi nutzbar ist. Die kann man dann einfach in eine Delphi-Unit überführen und damit ist dann eben auch der Zugriff auf die DLL möglich.

Gruß Der Unwissende
  Mit Zitat antworten Zitat