Klassen aus einer DLL nutzen

Ryu1991

Erfahrenes Mitglied
Hallo Leute,
erstmal, tolles forum.
Also mein Problem:
Ich habe eine Dll geschrieben (in c++), der header sah so aus:
C++:
#include <save.h>

class extern "C" __declspec(dllexport) archiv{
    public:
        archiv();
        void Work ();
        char* Naechstes_Archiv();
        char* Ausgeben_verarbeitete ();
        void Verschieben();
        char *startarchiv;
        bool reihe_komplett();



    private:
        char quellpfad[1000];
        char passwort[500];
        char winrarpfad[1000];
        char pfad_fuer_verarbeitete[1000];
        LOG logfile;

};


class extern "C" __declspec(dllexport) inhalt{
    public:
        inhalt();
        void Verschieben();
        char* Ziel_Ausgeben();


    private:
        char zielpfad[1000];
        char tempordner[1000];
        LOG logfile;

};
in der dazugehörigen cpp is alles ausprogrammiert, geht auch super.

Jetzt is mir nur beim aufrufen aufgefallen, dass es, nicht wie bei einer Funktion mit
Code:
typedef class (*beispiel)
und dann mit loadLibrary und GetProcAddress adress funktioniert.
und jetzt die Frage: Wie kann ich die Klassen aus der DLL nun benutzen:confused:

Im Vorraus danke für eine antwort.
 
Zuletzt bearbeitet:
Klassenmethoden haben intern andere Funktionsnamen
irgendsoein wirres zeug aus namen, klassennamen, ziffern, @ (glaub ich halt) ...
Den Namen musst du bei GetProcAddress angeben
 
Um dies zu realisieren brauchst du kein LoadLibrary und GetProcAddress verwenden.

Du könntest etwas definieren sagen wir mal beispielsweise "MeinProjektMakros.h":
Code:
#ifdef MEIN_PROJEKT_EXPORTS
#    define MEIN_PROJEKT_API __declspec(dllexport)
#else
#    define MEIN_PROJEKT_API __declspec(dllexport)
#endif

MeineKlasse.h
Code:
#include "MeinProjektMakros.h"

class MEIN_PROJEKT_API MeineKlasse {
public:
    MeineKlasse();
    virtual ~MeineKlasse();
};

MeineKlasse.cpp
Code:
#include "MaineKlasse.h"

MeineKlasse::MeineKlasse() {
}

MeineKlasse::~MeineKlasse() {
}

MEIN_PROJEKT_EXPORTS ist dann halt das Makro das nur definiert sein sollte, wenn
du die DLL Kompilierst. Somit würde beim Kompilieren der DLL bei der Klasse
__declspec(dllexport) benutzt. Wenn du diese Klasse nun aus der Kompilierten DLL
benutzen möchtest reicht es einfach den Klassen-Header zu inkludieren und ein
Objekt der Klasse zu erstellen.

Code:
#include "MeineKlasse.h"

int main() {
    MeineKlasse mk;
}

Da MEIN_PROJEKT_EXPORTS nur beim Kompilieren
der DLL definiert ist, wird beim benutzen in einer anderen Anwendung
__declspec(dllimport) bei der Klasse stehen. Nicht vergessen die .lib zu linken.

Best wishes
FBIagent
 
Zuletzt bearbeitet:
Ich habe das erst beim letzten Satz verstanden und auch da nur zur hälfte, also Folgende situation:
Ich benutze Dev-Cpp das teil kann als statische bibliothek nur .a dateien erzeugen, ich habe die dll für andere geschrieben und wollte für einen beispiel code wissen wie man das benutzt, oder können andere entwicklungsumgebungen auch was mit den .a dateien anfangen? In dem Fall wäre das kein Problem.

Ach ja, nur so nebenbei, was bedeutet das virtual vor dem destruktor?
 
Okay wenn ich zu unverständlich war versuche ich es nocheinmal.

Code:
class __declspec ( dllexport/dllimport ) MeineKlasse

Sorge dafür wenn du die DLL Kompilierst, dass dllexport angegeben ist. Beim einbinden
in einem anderen Projekt dllimport. In einem anderen Projekt wo du die DLL einbinden
möchtest einfach die .a Datei dem Linker mitteilen und den Header der Klasse inkludieren
und ein Objekt erstellen:
Code:
MeineKlasse mk;

Zur Veranschaulichung hab ich mal kurz 2 Projekte erstellt:
http://freehost06.websamba.com/fbiagent/tuto_1545151.zip

Das virtual beim destructor ist eigentlich nur beim Vererben wichtig, habe ich mir
allerdings angewöhnt es immer so zu machen.

Ich weis nicht in wie fern andere Compiler sich mit dem von deinem erstellten kompatibel verhalten.

Best wishes
FBIagent
 
Zuletzt bearbeitet:
OK, vielen Dank, das hat mir jetzt sehr geholfen :D

EDIT:
Hm...Ich dachte ich hätte es verstanden, aber ich bekomme immer Folgende Meldung: "[Linker error] undefined reference to `_imp___ZN6archivC1Ev' ", obwohl ich eigentlich alles genau so gemacht habe wie du, woran liegts?
 
Zuletzt bearbeitet:
Bei mir trat der gleiche Fehler auf als ich die implementierung der Methoden in
eine extra cpp datei gelegt hatte. Erlich gesagt weis ich gerade nicht woran das liegt
da ich eigentlich nur MSVC benutze.

Best wishes
FBIagent
 
Ok, habe jetzt versucht das ganze mir Code::Block zu compilieren, da kommt immer ne Meldung: "cannot find -lAutoentpackerDll", wenn ich ihm im linker die bibliothek zeige, wenn ich es mit #pragma comment(lib, "libAutoentpackerDll.a") versuche tut er so, als gäbe es die zeile gar nicht und meckert über 1000 funktionen rum.

EDIT: Also es klappt jetzt, ich habe dieversem an-den-Parameter-rumfummeln irgendwie geschaft das ganze doch noch irgendwie hinbekommen, aber fragt mich nicht, wie.

Und dickes danke an FBIagent für die hilfe
 
Zuletzt bearbeitet:
Zurück