Mit C an eine C++ [OO] .dll anbinden ???



  • Hallo,

    mein problem ist, das ich mit C code auf eine OO C++ .dll zugreifen möchte.

    Geht sowas überhaupt ?
    (Ich habe keine ahnung wie es gehen soll ein "object" zu instanzieren in C ....
    oder gibt es da irgendwelche anbindungen ?



  • Da c kein OO kann, kannst du auch keine referenz von Objekten erzeugen.



  • Mach Dir auf der C++-Seite Schnittstellen-Funktionen, die mit

    extern "C" DLLEXPORT(void) func( void ) {
       // ...
    }
    

    bzw.

    extern "C" {
       DLLEXPORT(void) func( void ) {
          // ...
       }
    }
    

    z.B. deklariert sind, und exportiere die in die DLL.

    Das DLLEXPORT()-Makro, das ich angegeben habe, musst Du je nach Compiler entsprechend vorher definieren, bei Visual C++ z.B.

    #define DLLEXPORT( rettype )  _declspec(dllexport) rettype
    

    Damit stellst Du sicher, dass nur C-Funktionen in die DLL exportiert werden. Dann ist es auch kein Problem, im C Programm

    extern void func( void );
    

    zu schreiben, bzw.

    #define DLLIMPORT( rettype )   _declspec(dllimport) rettype
    

    und

    extern DLLIMPORT(void) func( void );
    

    aber wie gesagt, das haengt vom Compiler ab.

    Wenn Du das nicht machen willst, wird's kompliziert. Dann musst Du Dir z.B. mit DUMPBIN Deine DLL angucken und herausfinden, wie die Funktionen heissen, die exportiert wurden. Da C++ Bezeichner meist gemangled werden, sehen die ziemlich komisch aus, und sind von C aus schwierig zu importieren (je nach Compiler/Linker).

    Am besten ist, Du packst alle C++ Funktionalitaet in die C++-DLL und exportierst nur normale C Funktionen (wie oben erwaehnt).

    Du musst naemlich auch Exceptions abfangen (falls sie verwendet werden), da sonst das Programm einfach rausfliegt oder Du Abstuerze wegen des anderen Stackframes kriegst. D.h. in die C-Schicht duerfen keine C++ Spezifika einfliessen.

    Wenn Du Exceptions und RTTI ausgeschaltet hast, kannst Du die C++ Funktionen im Prinzip wie normale C-Funktionen aufrufen, bei nicht-statischen Objektmethoden musst Du immer den this-Zeiger als erstes uebergeben. Und natuerlich musst Du Konstruktoren und Destruktoren selber aufrufen. Unter Windows koennen in dem Zusammenhang GetProcAddress() und Funktionstabellen von grossem Nutzen sein. Bei virtuellen Methoden musst natuerlich uebrigens auch auf die VFT (virtuelle Funktionstabelle Ruecksicht nehmen).

    Also, die Loesung, die ich oben erwaehnt habe, ist mit Sicherheit die einfachste. 😉



  • Vielen Dank für die ausfühliche Antwort. Ich glaube ich hab dabei richtig was gelernt 🙂

    Ich glaube das anpassen der C++ seite so das es simple schnittstellen bietet wäre das einfachste.

    Unter Berücksichtigung des Textes sollte es rein theoretisch möglich sein
    C++ auf C zu mappen, und das ganze rein theoretisch sogar wieder in Klassen zu fassen ?

    Angenommen man hätte nur den zu C konvertieren C++ OO code und möchte ihn in C++ OO zurückwrappen - sicherlich ne scheiss arbeit, aber theoretisch könnt das so gehen, oder ?

    struct foo
    {
    int x;
    }

    void xx(foo* f)
    {
    f->x = 5;
    }

    zu:

    class myfoo : public foo
    {
    void xx()
    {
    ::xx(this);
    }



  • Ja, klar, kann man so machen! 🙂


Anmelden zum Antworten