Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Dll in MS VC++ laden

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.02.2008, 20:31 Uhr
~Maerc
Gast


Hallo.
Ich hab leider keine ahnung von C++ ...bin mehr so der Delphi Typ
Folgendes Problem: muss eine Delphi Dll in ein C++ Projekt laden... statisch oder dynamisch ist ziemlich egal. Natürlich sollte man dafür etwas Ahnung von C++ haben, hatte aber leider auch noch keine Zeit mir da wenigstens Einsteigerkenntnisse zu beschaffen.
Hab mir daher nun einfach paar Codeteile von verschiedenen Seiten gezogen...copy&paste (Schande über mein Haupt) - das Ganze natürlich jedesmal angepasst aber irgendwie tauchten jedesmal unzählige Fehler auf...und ich meine wirklich unzählig! Manchmal tauchte im Code selbst gar kein Fehler auf, sondern dann aber in der "SourceAnnotations.h" - was es damit auf sich hat, hab ich auch noch nicht so ganz verstanden...
Da das ganze langsam drängt, wäre es nett, wenn jemand den nötigen Code posten könnte und es etwas erklären würde... ich weiß lernt man erstmal nix dabei aber es ist relativ dringend
Mit C++ werde ich mich jedenfalls in nächster Zeit mehr beschäftigen, versprochen

Also Danke schonmal und hoffe es hst jemand eine einfache und verständliche Lösung.
Vorhanden ist natürlich nur die Test.dll und aufrufen möchte ich die Funktion "testen" ..diese gibt einen string zurück oder einen integer (also eins von beiden..das ist relativ egal, wenn also jemand nen Stück Code postet, würde ich meine dll daran anpassen). Ist nun eigentlich eine *.lib dazu nötig? Kann man ja mit so einem kleinen Tool vom MS-VC++ erstellen soweit ich weiß

Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.02.2008, 21:01 Uhr
0xdeadbeef
Gott
(Operator)


Ich verschieb den Thread mal ins richtige Forum.

Also, prinzipiell kommt eine DLL in drei Teilen - erstend die DLL, die den Code enthält, und die nachher zum Starten des Programms notwendig ist, zweitens die Header der Bibliothek, die zum Kompilieren gebraucht werden, und drittens die .lib-Datei, die zum Linken benötigt wird. (Sie enthält Stub-Funktionen, die auf die DLL zugreifen)

Das mit dem Linken von DLLs ist unter Windows etwas haarig, aus historischen Gründen - Je nachdem, woher der Kram geladen wird, sucht der Linker unterschiedliche Symbole; also kommt es ein bisschen auf die DLL an, wie das ganze zu kompilieren ist. (Das Lesen der Dokumentation wäre angebracht) Wie dem auch sei, prinzipiell musst du folgendes tun:

1. Die Header müssen dem Compiler bekannt sein. Typischerweise kommt eine Bibliothek mit einem include-Verzeichnis, dieses musst du Visual C++ als Header-Verzeichnis angeben (Extras -> Optionen -> VC++-Verzeichnisse, wenn ich mich recht entsinne. Jedenfalls etwas in der Art). Wichtig ist, dass der relative Pfad, den du in der #include-Direktive für die Header angibst, von dem Verzeichnis, das du dem Compiler angibst, die Header-Datei bezeichnet. Also wenn du zum Beispiel im Code

C++:
#include <test/test.h>


stehen hast, und test.h in c:\test-bibliothek\include\test\test.h liegt, musst du dem Compiler c:\test-bibliothek\include als Header-Verzeichnis angeben.

2. Die .lib-Datei muss dem Linker bekannt sein. Typischerweise kommt eine Bibliothek mit einem lib-Verzeichnis, in dem die Datei liegt, wichtig ist aber nur, dass der Linker die .lib-Datei finden kann. Wenn also deine Bibliothek in c:\test-bibliothek\lib\test.lib liegt, musst du ihm c:\test-bibliothek\lib als Verzeichnis angeben. Das geschieht an der selben Stelle, an der du auch das Header-Verzeichnis angibst, nur unter "Bibliotheksverzeichnisse."

3. Die .lib-Datei muss im Projekt als Abhängigkeit eingetragen sein. Das geschieht in den Projekteinstellungen im Unterpunkt "Linker." Unter "zusätzliche Abhängigkeiten" trägst du da "test.lib" ein, wenn deine .lib test.lib heißt. Möglicherweise auch nur "test", da bin ich grad nicht hundertprozentig sicher.

4. Die DLL muss zum Starten des Programms in PATH liegen. Typischerweise trägt man das in den Projekteinstellungen unter "Debug-Optionen" ein, beim Ausliefern des Programms reicht es, wenn die DLL im selben Verzeichnis wie die .exe liegt, die sie benutzt. Oder in c:\windows\system32.

5. Und jetzt wird's haarig. Also, sofern die Bibliothek nicht mit einer .def-Datei kompiliert wurde, die dekorative Dateinamen entfernt - und bei einer C++-Bibliothek wird das nicht der Fall sein - müssen in der Header-Datei all jene Symbole, die beim Kompilieren der Bibliothek mit __declspec(dllexport) exportiert wurden, in deinem Projekt, das die DLL benutzt, mit __declspec(dllimport) deklariert sein. Das ist eine Windows-Besonderheit, die, wie gesagt, historisch gewachsen ist. Wie deine Bibliothek das gelöst hat, kann ich dir nicht sagen - eine häufige Methode ist, dass beim Einbinden der DLL ein Präprozessormakro definiert sein muss, das dazu führt, dass an den entsprechenden Stellen __declspec(dllimport) eingefügt wird, allerdings gehen die Methoden da mitunter weit auseinander. Schau in die Dokumentation der Bibliothek, da muss das eigentlich drinstehen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 13.02.2008 um 21:01 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.02.2008, 11:17 Uhr
~Maerc
Gast


Hallo und Danke für die ausführliche Antwort. Denke mal ich hab alles verstanden und werds heut Abend mal ausprobieren.. nur Punkt 5 ist mir noch etwas unverständlich...bei Delphi mach ich ja nix mit dllexport... na mal schauen. Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.02.2008, 12:26 Uhr
0xdeadbeef
Gott
(Operator)


Wie gesagt, das ist ne Windows-Besonderheit - mir ist keine andere Plattform bekannt, die so etwas benötigte. Details findest du hier.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: