dll in C++(C)



  • Gibt es einen weg, wie man dlls direkt in C++ erstellt (ohne extern"C" im header) beziehungweise wie kann Ich komplexe C++ Objekte von Programm in die dll und zurück geben?



  • Da gib es keinen Unterschied zwischen C und C++. Import und Export funktioniert für Klassen analog zu Funktionen:

    class __declspec(dllexport) Klassenname
    {
      ...
    

    und entsprechend dllimport auf der "Verbraucherseite".

    Lars



  • manni66 schrieb:

    und entsprechend dllimport auf der "Verbraucherseite"

    Das habe ich noch nie gehört... Ist das wirklich notwendig?



  • Kommt drauf an. Wenn die DLLs per C-Schnittstelle aufgerufen werden sollen, wird extern "C" benötigt, damit der Compiler das Name-Mangling richtig macht, die Symbole werden dann wie C-Funktionen in die DLL compiliert und aus den anderen Programmteilen auch so aufgerufen.

    DLLs mit C++-Schnittstelle sind Plattform- und Compilerspezifisch, bei MSVC wird dazu die Funktion oder auch Klasse mittels __declspec(dllexport) in der DLL compiliert und mittels __declspec(dllimport) in der aufrufenden ÜE deklariert.

    Pro C-schnittstelle/contra C++-schnittstelle: Plauttformunabhängigkeit, Compilerunabhängigkeit, Sprachunabhängigkeit (DLLs mit C-Schnittstelle können auch aus anderen Sprachen aufgerufen werden, z.B. C, Delphi, ...)
    Contra C-Schnittstelle/pro C++-Schnittstelle: Es können Klassen und überladene Funktionen exportiert werden.



  • pumuckl schrieb:

    Kommt drauf an. Wenn die DLLs per C-Schnittstelle aufgerufen werden sollen, wird extern "C" benötigt, damit der Compiler das Name-Mangling richtig macht, die Symbole werden dann wie C-Funktionen in die DLL compiliert und aus den anderen Programmteilen auch so aufgerufen.

    DLLs mit C++-Schnittstelle sind Plattform- und Compilerspezifisch, bei MSVC wird dazu die Funktion oder auch Klasse mittels __declspec(dllexport) in der DLL compiliert und mittels __declspec(dllimport) in der aufrufenden ÜE deklariert.

    Pro C-schnittstelle/contra C++-schnittstelle: Plauttformunabhängigkeit, Compilerunabhängigkeit, Sprachunabhängigkeit (DLLs mit C-Schnittstelle können auch aus anderen Sprachen aufgerufen werden, z.B. C, Delphi, ...)
    Contra C-Schnittstelle/pro C++-Schnittstelle: Es können Klassen und überladene Funktionen exportiert werden.

    Naja, richtig plattformunabhängig ist auch eine C-Dll nicht. Eine mit MSVC für Windows 7 gebaute Dll mit C-Schnittstelle wird man weder unter Linux noch unter Windows 95 benutzen können.

    Auch mit C-Schnittstellen kann man C++-Klassen exportieren, jedoch muss man hierbei den Umweg über Interface-Klassen gehen.

    Richtig praktisch sind C-Dlls vor allem dann, wenn man sie zur Laufzeit laden will (z.B. mittels LoadLibrary). Das ist zum Beispiel sinnvoll, wenn man eine Pluginarchitektur aufgebaut hat, oder wenn eine Dll nicht unbedingt erforderlich ist. Dabei sind die dekorierten Namen von C++ nämlich äußerst störend, da man diese erst irgendwie herausbekommen muss. Bei einem C-Interface hingegen kann man direkt die angegebenen Namen benutzen.



  • daersc schrieb:

    manni66 schrieb:

    und entsprechend dllimport auf der "Verbraucherseite"

    Das habe ich noch nie gehört... Ist das wirklich notwendig?

    Es geht wohl auch so, Microsoft schlägt es dennoch vor. Da man aber eigentlich sowieso immer mit einem Macro arbeitet (schließlich muss ja das export weg), kann man dann auch das dllimport benutzen.

    Lars


Anmelden zum Antworten