Ist Objektorientiert Programmieren in Dlls möglich?



  • Interfaces! Wie das eben auch COM macht.



  • Aber wie richte ich ein Interface ein in einer Dll in der ich nicht mal ein Objekt erzeugen kann?



  • wieso, du kannst doch ne dll in bspw. in _Vc erstellen, und da class implementieren und nach ausen mit interfaces damit arbeiten..



  • Leider geht das nicht, da ich keine Klassen exportieren kann, sonst hätte ich das doch gemacht.
    Und leider habe ich auch keine Ahnung wie ich hier Interfaces verwenden kann.
    Edit:
    Also um ehrlich zu sein habe ich Überhaupt keine Ahnung von Interfaces.
    Und leider muss ich bei dem was ich hier machen soll aus Dlls heraus andere Dlls Objektorientiert aufrufen.
    Allmählich beschleicht mich der verdacht das ich mich entweder von den Dlls oder vom OO-Ansatz verabschieden kann.
    Weiß hier irgend wer weiter? / Kann mir da wer aus der patsche helfen?



  • wenn du in c++ programmierst, dann kannste doch die klassendefinition in ein .h packen und diese im hauptprogramm und der dll includieren. schon wissen beide, wie die klasse aussieht. zum austauch von objekt-referenzen kannste ja dann z.b. funktionen aufrufen:

    hauptprogramm:

    #include "myclass.h"
    __declspec(dllimport) void TellDll(MyClass *obj);
    ...
    MyClass myObject;
    TellDll (&myObject);  // jetzt kann die dll dein objekt verwenden
    ...
    

    dll:

    #include "myclass.h"
    MyClass *TheObject = 0;
    ...
    extern "C" __declspec(dllexport) void TellDll (MyClass *obj)
    {
      TheObject = obj; // hier kommt das object an   
    }
    ...
    TheObject->do_something();  // methodenaufruf des objects im hauptprogramm
    

    ^^so ungefähr könnte es gehen.
    der umgekehrte fall ist natürlich auch möglich.
    🙂





  • fricky schrieb:

    wenn du in c++ programmierst, dann kannste doch die klassendefinition in ein .h packen und diese im hauptprogramm und der dll includieren. schon wissen beide, wie die klasse aussieht. zum austauch von objekt-referenzen kannste ja dann z.b. funktionen aufrufen:

    Und zusätzlich sind zu beachten, das dies nur mit identischen Compilern funktioniert (fehlende Binärkompatibilität). Das Objekte die in einer DLL erzeugt werden auch dort freigegeben werden müssen... usw.

    So einfach ist es nicht OO in C++ über DLL-Grenzen zu verwenden. Da ich derzeit noch in einer gemischten Compilerumgebung arbeite (was das ganze Unmöglich macht), liegt es etwas zurück das ich mich hiermit auseinander gesetzt habe.

    Da ich in Kürze aber wieder in einer einheitlichen Compilerumgebung arbeite, würde mich tatsächlich mal interessieren was man nun alles beachten muss, damit man mit Klassen über DLL-Schnittstellen arbeiten kann (Wie gesagt: Identischer Compiler).

    cu André



  • OK, das mit den Aufrufen wusste ich schon, das funktioniert auch einwandfrei.
    Danke für eure Hilfe so weit. Leider sind meine Ziele etwas umfangreicher.
    Ich will Objekte in meiner Dll erzeugen und von dem Hauptprogramm auf diese dann zugreifen,ohne die Objekte übergeben zu müssen.
    Oder zumindest ohne das konkrete Objekt oder den Zeiger darauf übergeben zu müssen.
    Das ganze hat den sinn dass das Hauptprogramm nichts von den in der Dll vorhandenen Objekten sieht.



  • Mojo.Zache schrieb:

    Ich will Objekte in meiner Dll erzeugen und von dem Hauptprogramm auf diese dann zugreifen,ohne die Objekte übergeben zu müssen.
    Oder zumindest ohne das konkrete Objekt oder den Zeiger darauf übergeben zu müssen.

    Und wie soll dieser Zugriff im Hauptprogramm konkret aussehen?



  • Ich rufe eine Funktion auf die auf ein, in der Dll als Global definiertes,
    Objekt zugreift das vorher von einer anderen Funktion in der Dll Initialisiert wurde.
    also so:

    void DllExport StartQuotation(string sInput, int iInput){
    
        *RunQout = new Quotation(); //sInput,iInput
        RunQout->SetData(sInput,iInput);
        QuotIsInit= true;
        cout << RunQout->getData();
    }
    
    string DllExport GetQuotFromObj(string Name, int QuotNr){
    
        if (QuotIsInit)
        {
            return RunQout->GiveText(QuotNr);
        }
        else
        {
            return "Error\n"
        }
    }
    

    Edit:
    Leider gibt er beim kompilieren Fehler aus: wo nach im Objekt definierte Variablen nicht deklariert sind.



  • Mojo.Zache schrieb:

    Leider gibt er beim kompilieren Fehler aus: wo nach im Objekt definierte Variablen nicht deklariert sind.

    Äh ja. Schreib bitte mal die genaue Fehlermeldung, nicht deine Interpretation.



  • Sorry....

    nocheinedll\quotation.cpp(66) : error C2065: 'i_Number' : undeclared identifier



  • Mojo.Zache schrieb:

    Sorry....

    nocheinedll\quotation.cpp(66) : error C2065: 'i_Number' : undeclared identifier

    Ja, der Code dazu wäre wohl auch hilfreich 🙄



  • oops ... brauche wohl noch mehr kaffee...

    Quotation.cpp

    #include "StdAfx.h"
    #include "Quotation.h"
    
    Quotation::Quotation(void)
    {
       m_Name="Niemand";
       i_Number=0;
    }
    
    Quotation::~Quotation(void)
    {
    }
    
    bool Quotation::SetData(string Name, int Number)
    {
        i_Number= Number;
        m_Name= Name;
        return false;
    }
    string GiveText(int Number){
    
        string sWorking, s_text;
        //sWorking = m_Name;
        sWorking = "Name";
        switch (Number)
        {
        case (1):
                s_text= "Qoute 1\n";
                break;
        case (2):
                s_text= "Qoute 2\n";
                break;
        case (3):
                s_text= "Qoute 3\n";
                break;
        default: 
                s_text= "Qoute def.\n";
                break;
        }
        sWorking += "sagt: ";
        sWorking += s_text;
    
        return sWorking;
    }
    int GetData(){
    return i_Number;
    }
    

    Quotation.h

    #pragma once
    
    class Quotation
    {
    public:
        Quotation(void);
        virtual ~Quotation(void);
    //    Quotation(string Name, int Number);
    
    private:
        int i_Number;
        int i_quotelot;
        string GiveText(int Number);
        int GetData();
    
    public:
        string m_Name;
        bool SetData(string Name, int Number);
    
    };
    


  • string Quotation::GiveText(int Number)
    { 
        string sWorking, s_text; 
        //sWorking = m_Name; 
        sWorking = "Name"; 
        switch (Number) 
        { 
        case (1): 
                s_text= "Qoute 1\n"; 
                break; 
        case (2): 
                s_text= "Qoute 2\n"; 
                break; 
        case (3): 
                s_text= "Qoute 3\n"; 
                break; 
        default: 
                s_text= "Qoute def.\n"; 
                break; 
        } 
        sWorking += "sagt: "; 
        sWorking += s_text; 
    
        return sWorking; 
    } 
    int Quotation::GetData(){ 
    return i_Number; 
    }
    


  • Ok ein grober Fehler…
    Leider behebt er das Problem an sich nicht.
    Um genau zu sein gibt er einen Fehler aus den ich gar nicht zu ordnen kann.

    nocheinedll\dllmain.cpp(75) : error C2100: illegal indirection

    Was in der Zeile mit dem Konstruktor Aufruf angegeben wird.



  • Dann mach mal den Stern da weg.



  • So einfach ist es nicht OO in C++ über DLL-Grenzen zu verwenden. Da ich derzeit noch in einer gemischten Compilerumgebung arbeite (was das ganze Unmöglich macht), liegt es etwas zurück das ich mich hiermit auseinander gesetzt habe.

    Da ich in Kürze aber wieder in einer einheitlichen Compilerumgebung arbeite, würde mich tatsächlich mal interessieren was man nun alles beachten muss, damit man mit Klassen über DLL-Schnittstellen arbeiten kann (Wie gesagt: Identischer Compiler).

    Mit MSVC musst du überall die DLL Runtime verwenden, und immer alles neu übersetzen, dann gibt's eigentlich keine Probleme mehr.
    Wenn du nicht neu übersetzen willst, dann musst du die Header-Files konstant halten (PIMPL/compilation firewall), dann kann eigentlich auch nixmehr passieren.

    Und verwenden kannst du dann wirklich alles, also Exceptions werfen und fangen, RTTI, ... alles halt.



  • Das war es!
    Super. Jetzt funktioniert der Aufruf auch endlich!
    Und das bedeutet auch da ich in meiner Dll auch mein OO Entwurfsmuster umsetzten kann.
    Danke an alle die mir geholfen haben.
    Werde aber in Zukunft erst Wach werden und dann erst ins Forum Posten…
    auf das ich euch nicht mit so trivialen Problemen nerve… 😃


Anmelden zum Antworten