Dll Verweis ohne Projekt



  • Hey alle zusammen,

    ich habe eine Klasse geschrieben, die ich anschließend in eine DLL kompiliert habe. Nun konnte ich diese auch nutzen indem ich in meinen folgenden Projekten einen Verweis auf das Projekt der DLL erstellt habe. Nun würde ich jedoch gerne die DLL nutzen ohne immer gleich auf das ganze Projekt verweisen zu müssen.

    Ich würde es gerne ähnlich wie bei einer statischen Bibliothekt (.lib) arrangieren, sodass ich bei der zukünftigen Nutzung der DLL nur noch die DLL selbst und z.B. noch die Header benötige um Zugriff auf die Klasse zu erhalten. Dahinter steckt neben den praktischen Gründen halt auch der Wunsch nicht jedem vollen Zugriff auf den Quellcode zu gewähren.

    Habt ihr ne Ahnung wie das zu realisieren ist 😉 ?

    Grüße nerdted



  • - Die DLL- Datei erzeugen
    - Mit ImpLib eine Lib- Datei daraus machen
    - Im ZielprojekT: Lib- Datei benutzen lassen und Header- Datei einbinden
    - Voila

    Gruss
    Frank



  • Hey Frank, danke für deine Antwort 😉
    Das mit der Lib hab ich jetzt mal gemacht, das Problem ist, dass ich nun die Resource Dateien die ich in dem Dll Projekt nutze bei der Lib nun explizit bei jedem Projekt zusätzlich verlinken muss. Daher möchte ich doch bei der Dll bleiben, da ich mich so von noch mehr includes verarschieben kann weil sie mit in der Dll stecken.

    Geht das mit der Dll nicht doch irgendwie? Möchte ja eig. nur ne Klasseninstanz aus der Dll ziehen, allerdings bekomm ich das nicht hin sondern bekomme ehr linker error :o



  • Hallo

    Die lib brauchst du zusätzlich zu dll, Altenburger hat das schon richtig dargestellt.
    Da du eine Klasse benutzt und damit compiler-spezifisches C++ (womöglich sogar VCL-Komponenten), kannst du nicht einfach mit einer DLL und einer Header-Datei arbeiten. Das geht nur bei reinem C.
    Wiviele includes du brauchst, ist aber nicht abhängig von lib oder nicht. Du must nur einmalig die lib ins Projekt einbinden.

    bis bald
    akari



  • Hi akari 😉
    danke auch dir für deine Antwort.

    Mir fällt es immer schwer, zwischen C und C++ zu unterscheiden. Ich habe jetzt eine implementierung gefunden, bei der ich nur zweit Funktionen aus der DLL laden muss. Die eine gibt mir einen Zeiger zu einer Klasseninstanz und die andere gibt den allokierten Adressraum wieder frei.

    Das mit den Resourcen konnte ich durch eine Implementierung der Klasse in einer DLL leider auch nicht lösen. Dazu musste ich nun eine zweite DLL anlegen, eine reine Ressourcen DLL, die ich im Nachhinein auch von einer lib hätte laden können 😃 Aber immerhin hab ich jetzt was dazu gelernt.

    Hier mal eine grobe Übersicht, wie ich das Problem gelöst hab, für alle, die vielleicht irgendwann ähnliches suchen:

    // Dieser Code gehört sowohl in die Header der DLL als auch in die Header, die später die Funktionen der DLL bekannt macht
    
    #define DLLEXPORT __declspec(dllexport)
    
    class Skin {
    
    public:
    	virtual LRESULT CALLBACK MessageHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) = 0;
    
    public:
    	virtual void setWindowStyle(WINDOWSTYLE WS) = 0;
    	virtual void setCloseButtonState(BUTTONSTATE BS) = 0;
    	virtual void setMaxButtonState(BUTTONSTATE BS) = 0;
    	virtual void setMinButtonState(BUTTONSTATE BS) = 0;
    
    private:
    // Weitere rein virtuelle Methoden
    };
    
    /* Folgender Code gehört ausschließlich in die Header der DLL unter den bereits eingefügten Code */
    
    class CustomSkin : Skin {
    
    public:
    	CustomSkin(HWND hForm);
    	virtual ~CustomSkin();
    
    	virtual LRESULT CALLBACK MessageHandler(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
    
    public:
    	virtual void setWindowStyle(WINDOWSTYLE WS);
    	virtual void setCloseButtonState(BUTTONSTATE BS);
    	virtual void setMaxButtonState(BUTTONSTATE BS);
    	virtual void setMinButtonState(BUTTONSTATE BS);
    
    private:
    // Weiter Funktionen
    
    /* In Custom Skin werden die bereits deklarierten Methoden endgültig definiert. Private Funktionen müssen nur hier bekannt sein, da sie bei der Nutzung der DLL so wie so nicht vom Nutzer aufgerufen werden können */
    };
    
    // Hier nun zwei Funktionen, die vom Nutzer der DLL geladen werden müssen
    
    static CustomSkin *skin = NULL;
    
    extern "C" DLLEXPORT Skin* getSkin(HWND hForm);
    extern "C" DLLEXPORT void releaseSkin();
    
    // Die Definition gehört natürlich in die CPP
    
    //extern "C" DLLEXPORT Skin* getSkin(HWND hForm) {
    //
    //	if(!skin) {
    //
    //		skin = new CustomSkin(hForm);
    //	}
    //
    //	return (Skin*)skin;
    //}
    //
    //extern "C" DLLEXPORT void releaseSkin() {
    //
    //	if(skin) {
    //
    //		delete skin;
    //		skin = NULL;
    //	}
    //}
    

    Ich hoffe ich konnte meine Vorgehensweise einigermaßen verständlich zeigen.
    Ich selber habe mir diese Vorgehensweise auch nur anhand von verschiedenen Beispielen zusammengebastelt und kann leider selbst nicht erklären, warum es nötig ist meine Klasse von einer rein abstraken Klasse erben zu lassen. Ich hab immer wieder ein wenig herumgebastelt, anders hat es jedoch nicht geklappt.

    Die Resourcen habe ich wie bereits gesagt in einer reinen Resourcen DLL hinterlegt, mit LoadLibrary geladen und mit dem Rückgabewert "LoadBitmap" aufgerufen. Dann war alles geschafft 🙂


Anmelden zum Antworten