Einzelnen Beitrag anzeigen

Der_Unwissende

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

Re: C++-Lib/Dll in Delphi einbinden

  Alt 12. Nov 2005, 13:41
Hi,

Zitat von glkgereon:
Hi,
1) Wo genau ist der Unterschied zwischen einer Lib und einer Dll?
2) Wie kann man die jeweils einbinden?
3) Welches sollte man nehmen?
4) Gibt es nicht Typenkonflikte? Wie übergebe ich am einfachsten ein array of String z.B.?
1) Der Unterschied liegt darin, dass eine Lib statisch gelinkt wird, eine DLL dynamisch.

2) Bei libs weiß ich nicht, ob du die einbinden kannst, wird aber sicher irgendwer hier wissen. DLLs kannst du auf zwei Arten einbinden. Die findest du schnell mit der Suche in der DP. Geh gleich nochmal näher drauf ein.

3) Hängt davon ab, ob man libs überhaupt einbinden kann.

4) Alle Typen haben ein Pendant in der anderen Sprache (ok, stark verallgemeinert, sollte aber so ziemlich keinen Typen geben auf den das nicht zutrifft).
Wichtig ist, die Typen richtig zu überführen. Ich glaube in C++ wirst du nicht wirklich ein String finden (ist wenn ich mich nicht irre sehr Delphi spezifisch), aber C++ kennt dafür ein PChar (*Char oder so). Wenn du ein Array of PChar hast, entspricht das dann einem (**Char). Es gibt halt für so ziemlich alle primitiven Typen eine Übersetzung und alles andere lässt sich aus primitiven Typen zusammenbauen. Der Aufwand kann nur stark varrieren.
Auch zur Umwandlung spezieller Typen gibt es Tabellen und Erklärungen und viel Hilfe in der DP

nochmal zu 2), mit der einfachsten Methode:
Wenn du eine DLL einbinden möchtest, kannst du die Methoden, die in der DLL exportiert werden in deiner Unit benutzen. Dazu schreibst du deren Namen ganz normal in den Interface Teil, markierst diese jedoch als external und gibst die Datei an, aus der die geladen werden. Wichtig ist dabei, die Groß/Kleinschreibung der Methoden zu beachten (DLLs sind da nicht so flexibel wie Delphi) und die Aufrufkonventionen (z.B. pascal oder stdcall), die legen fest, wie die Parameter übergeben werden, wo abgelegt und wer wieder freigibt und so weiter...
Bei Delphi Methoden wird natürlich immer pascal (schau mal in die Hilfe, vielleicht heißt es doch anders) benutzt, die meisten C/C++ DLLs die ich benutzt hatte, waren stdcall oder selten mal cdecl (kann dein Kumpel aber auch festlegen).
Ja, ein Beispiel sähe dann so aus
Delphi-Quellcode:
CONST DLL_NAME = 'meineDll.dll';

procedure Proc1(str : PChar; const mem); stdcall; external DLL_NAME;
function Func1(param1 : Integer; param2 : Integer) : Int64; stdcall; external DLL_NAME;
function Func2(param1 : Integer; param2 : Integer) : Int64; stdcall; external DLL_NAME;

implementation
end.
Sorry, nicht gerade gut benannte Parameter und Methoden, aber soll nur veranschaulichen, wie man es machen kann. Rate dir dazu den Namen der dll in einer konstanten zu speichern (weniger ärger wenn sich die dll ändert). Bei Reihenfolge von Aufrufkonvention und external Klausel bin ich mir nicht sicher, musst du vielleicht umdrehen (wenn er meckert).
Ansonsten war es das schon. Kannst den Methoden auch eigene Namen geben und dann einen Verweis auf die Methode in der Dll machen. Und in diesem Fall hast du natürlich auch nichts vom dynamischen Linken, denn alle Funktionen werden beim Start deines Programms direkt gelinkt (also recht statisch). Es gibt auch einen Weg dies erst beim Aufruf der Methode zu machen (Ressourcen schonender, aber auch langsamer und komplizierter). Wie gesagt, dies ist der einfachste Weg.

Gruß Der Unwissende
  Mit Zitat antworten Zitat