C++-Objekte/Methoden exportieren



  • Hi,

    ich weiß dass DLLs eigentlich reine C-Interfaces sind und dementsprechend nur C-Konstrukte exportieren sollten. Allerdings habe ich gesehen, dass Toolkits wie Qt oder wxWidgets ebenfalls zu diesem Hack greifen und ihre Objekte per DLL-Interface zur Verfügung stellen.

    Allerings: wie geht das genau? Um ein Objekt per DLL exportieren zu können muss das irgend wie so deklariert sein:

    class __declspec(dllexport) MyClass
    

    ...und für den Import entsprechend

    class __declspec(dllimport) MyClass
    

    Reicht das oder muss ich hier noch zusätzliche Maßnahmen ergreifen? Und wie sieht das mit den Objektmethoden aus, wie lege ich fest, welche exportiert werden dürfen und welche nicht? Ich denke da speziell an Methoden, die DLL-intern public oder protected sind, weil sie in der internen Hierarchie von abgeleiteten Objekten verwendet werden dürfen, die auf der DLL-Schnittstelle aber nicht sichtbar sein sollen.


  • Mod

    Es wird alles wie es ist exportiert.
    Man kann keine Einschränkungen treffen.
    Du kannst also eine Klasse auch public ableiten und alle protected member und Methoden erben und benutzem.



  • Martin Richter schrieb:

    Es wird alles wie es ist exportiert.
    Man kann keine Einschränkungen treffen.

    Autsch...so etwas wie libtool gibt es also nicht um bestimmte Methoden nach außen hin unsichtbar zu machen?

    Ach ja: wie sieht es eigentlich mit der Kompatibilität der Kompilate aus - dass ich eine mit MingW erstellte DLL nicht aus einer Visual Studio Applikation nutzen kann ist ja sehr wahrscheinlich. Aber würde z.B. eine mit VC6 gebaute DLL auch in einer Visual Studio 2010 Anwendung nutzbar sein? Oder muss ich ganz exakt auf Compilerversion und -servicepack achten?


  • Mod

    Nein! Keine Canche.

    Es muss in jedem Fal der gleiche Compiler, (ich würde sogar sagen gleicher SP-Level) sein. In jedem Fall identische Libs.

    Wenn Du unabhängig sein willst, benutzt pure virtual Interfaces oder so was wie das Pimpl Idiom zum kapseln.

    Mit pure virtual Interfaces kannst Du sogar Compiler übergreifend kompatibel sein, denn das COM vtables Format wird IMHO von allen Compilern unterstützt.



  • Martin Richter schrieb:

    Wenn Du unabhängig sein willst, benutzt pure virtual Interfaces

    Das fällt leider auch weg, da ich Klassen exportieren wollte, die ihrerseits wieder von wxWidgets-Klassen erben.

    Scheint als gäbe es da eine echte Lücke...


Anmelden zum Antworten