C++ DLL in C Programm verlinken??



  • Mal ne blöde Frage... (oder auch nich!?:)

    kann ich bspw. ein C++ Programm in eine DLL packen, und dies dann in einem C Programm verwenden??

    Grüße



  • Hallo

    Du packst natürlich kein Programm in eine DLL, sondern Funktionen/Klassen.
    Wenn du für die DLL ein C-Interface einbaust kannst du auch diese DLL von C aus benutzen. Innerhalb der DLL kannst du dann wieder mit Klassen etc arbeiten.

    bis bald
    akari



  • ja das problem ist , das ich meinentwegen 50 Klassen in einem Modul haben.. diese Modul will ich all DLL exprotieren und ich einem C Programm verwenden..

    Die problematik liegt darin, das ich ja in C keine Klassen habe, und ich weis nich genau , ob ich aus einem C++ Code generierte DLL in einem C Programm verwende.......

    Müsste gehen oder? kenn mich nich so aus



  • Da kommst Du bestimmt selbst drauf:
    Welchen Header bindest Du in Dein C-Programm ein ? Was soll da drin stehen ? Was soll der C-Compiler damit machen ? ... 😉

    Gruß,

    Simon2.



  • Hallo

    Gar nicht. C kann nicht mit C++ Klassen umgehen. Du must dafür ein C-Interface in die DLL stecken um die C++ Klassen zu wrappen.

    bis bald
    akari



  • mach mal ein Beispiel.. akari.. sorry.. wenn ich so Anfängermäsig frage



  • Hallo

    Nehmen wir mal an du hast so eine Klasse

    class IntBuf
    {
    public :
      IntBug(int zahl) : m_zahl(zahl) {};
      int GetZahl() {return m_zahl;};
    private :
      int m_zahl;
    };
    

    Um diese Klasse aus einer DLL heraus für C verfügbar zu machen must du dafür ein C-Interface schreiben und in die DLL packen. Dazu betrachtest du die Instanzen der Klasse an sich als Speicherblöcke, die per Handles verwaltet werden

    typedef void* c_IntBuf;
    
    c_IntBuf CreateIntBuf(int zahl)
    {
      return reinterpret_cast<c_intBuf>(new IntBug(zahl));
    }
    int GetZahl(c_IntBuf intbuf)
    {
      return reinterpret_cast<IntBuf*>(intbuf)->GetZahl();
    }
    void FreeIntBuf(c_IntBuf intbuf)
    {
      delete reinterpret_cast<IntBuf*>(intbuf);
    }
    

    Diese neuen Funktionen können nun von der DLL in C-Manier exportiert werden (extern C...) und von jeder anderen DLL-fähigen Entwicklungsumgebung verwendet werden, auch C

    bis bald
    akari



  • /* DLL */
    extern "C" int meineCFunktionInCpp() {
      // mach was C++ mässiges
      Klasse k;
      k.Irgendwas( new Klasse2 );
      k.Irgendwas( new Klasse3 );
      k.Aufraeumen();
    }
    
    /* C-Programm */
    int main(void) {
      meineCFunktionInCpp();
    }
    

    EDIT:
    Ok, etwas abstrakter als akaris, und ausserdem viel zu spät...



  • [edit: zu spät]



  • Hallo

    @LordJaxom : Ich habe eben gezeigt wie Klassen direkt gewrappt werden, du degegen wie zusammenhängende Funktionalität. Hat beides seine Vor- und Nachteile. 😉

    bis bald
    akari



  • Hi,

    man darf aber nicht vergessen, dass man eben mit C-Mitteln nicht alles abbilden kann, was C++ kann. Bei Vererbung, templates, overloading, accesspecifier, .... ist da nicht viel oder nur mit einer Menge Fingerbrechen zu machen.
    ... und exceptions muss man sowieso immer alle fangen und in C-Fehlerhandling umwandeln.

    Gruß,

    Simon2.


Anmelden zum Antworten