Klasse aus Dll auslesen



  • Hallo Leute, cooles Forum.
    Also zu meinem Problem:
    Ich habe eine DLL geschrieben, der header sah so aus:

    #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;
    
    };
    

    Jetzt habe ich aber das problem, dass ich nicht weiß, wie ich diese Klassen benutzen kann wenn ich die dll in einem Programm aufrufe, ich kenne nur die methode mit typedef, LoadLibrary und GetProcessAdress, dummerweise haut das bei mir nur mimt funktionen hin. 😞

    Könnt ihr mir möglichst einfach zeigen, wie ich jetzt die klassen benutzen kann wenn ich die dll in einem Prog aufrufe? Ach ja, ich benutze Dev-cpp und habe dementsprechend keine VC++ befehle zur verfügung
    Thx für antworten, gruß Ryu



  • VC++ Befehle gibts im Quellcode selbst kaum, höchstens M$-spezifische API, aber die steht auch unter dem MinGW zum Großteil zur Verfügung.

    Aber deine eigene DLL im eigenen Programm verwenden ist doch einfach:
    Einfach den header in dein Programm includen und gegen die Lib linken, die dir Dein Compiler erstellt hat.

    Übrigens kannst du das extern "C" bei Klassen weglassen. Bringt eh nix.
    Das nächste:
    Schreib nicht __declspec(dllexport) sonst brauchst du 2 versch. Header. Definiere einen Bibliotheksheader und in dem schreibst du:

    #ifdef MYPROJECT_EXPORTS
    #define MYPROJECT_APICALL __declspec(dllexport)
    #else 
    #define MYPROJECT_APICALL __declspec(dllimport)
    #endif
    

    Jetzt definierst du im DevCPP, wenn du die DLL baust, das Define MYPROJECT_EXPORTS. Oder gibst direkt -DMYPROJECT_EXPORTS als Kommandozeilenoption an.

    Dann includest Du die Header-Datei der DLL wie gesagt in deinem anderen Projekt und linkst gegen die Lib. Fertig. (-lMyProject.lib als Kommandozeilenoption)

    #include <save.h>
    
    #ifdef MYPORJECT_EXPORTS
    #   define MYPROJECT_APICALL __declspec(dllexport)
    #else
    #   define MYPROJECT_APICALL __declspec(dllimport)
    #endif
    
    class MYPROJECT_APICALL 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 MYPROJECT_APICALL inhalt{
        public:
            inhalt();
            void Verschieben();
            char* Ziel_Ausgeben();
    
        private:
            char zielpfad[1000];
            char tempordner[1000];
            LOG logfile;
    
    };
    
    // In deinem Projekt dann als Bsp:
    #include <myproject.h>
    void foobar()
    {
       archiv MyArchiv;
       inhalt myInhalt; 
    }
    

    rya.



  • Danke, aber das funktioniert nich so ganz.
    1. Ich habe dev-cpp und das erstellt keine .lib sondern nur .a auber gut ich habe die gelinkt, dass dumme ist jetzt nur
    2. Ich erhalte immer Folgenden Fehler: " [Linker error] undefined reference to `_imp___ZN6archivC1Ev' " und noch eine ganze menge ähnlicher fehler.

    Was is der Grund?



  • Ja, das heisst beim gcc .a. Ist aber das selbe. Es ist die Export-Bibliothek.
    Hast du daran gedacht MYPROJECT_EXPORTS zu definieren?
    Wo kommen die Fehler? Beim bauen der lib oder Anwendung?
    rya.



  • Der Fehler Kommt wenn ich das script compilieren will, was die dll aufruft. Die DLL selber lässt sich super Compilieren.
    Ah was bedeutet das extern "C" eigentlich?



  • extern "C" sorgt dafür, dass das namemangling von C++ abgestellt wird.
    Folgendes Beispiel:
    void foo();
    Der C++-Compiler macht daraus:
    void @23foo()zhg@;
    oder so ähnlich ;).
    mit
    extern "C" void foo();
    bleibt das dann so wie es ist.
    rya.



  • Scorcher24 schrieb:

    mit
    extern "C" void foo();
    bleibt das dann so wie es ist.

    nee. wird zu _foo also mit unterstrich. 😛



  • Hat auf das fertige Programm also gar keine Auswirkungen? Wozu gibts den Befehl dann? 😕
    Was mir aber erstmal wichtiger wäre: was habe ich falsch gemacht, warum bekomme ich diesen dämlichen linker error?



  • So, hab das mal durchprobiert. Ich schätze der Fehler liegt beim DevCPP.
    Hab ein Beispiel gemacht und das versucht zu kompilieren. Bei der Verwendung von dlltool hatte ich den Fehler den du hattest. Hab dann die Parameter etwas modifiziert und jetzt gehts... allerdings hab ich das auf der Konsole gemacht, weil ich den DevC++ nicht mag und nicht habe.
    Hier kannst Du Dir mal die Dateien runterladen und Dir anschauen:
    http://www.file-upload.to/download.php?file=384Beispiel.rar

    // Build Befehl für die DLL
    g++ dll_test.cpp -WALL -DMYPROJECT_EXPORTS -DWIN32 -shared -Wl,--out-implib,libTest.a
    
    // Build für das Programm
    g++ proc.cpp -WALL -L./ -lTest -o test.exe
    

    Liegt aber alles bei als .cmd.
    rya.



  • Hmm, danke, aber deine cmd-dateien funktionieren nicht, wenn ich sie ausführe passiert gar nix. Und was muss ich da modifizieren, damit ic meine eigenes dll-aufruf programm compilieren kann?



  • Der g++ sollte natürlich über die Kommandozeile erreichbar sein -.-
    Das sollte man eigentlich schon wissen -.-



  • Sorry, falls ich mich jetzt besonders doof anstelle, aber was muss ich machen, damit g++ über cmd erreichbar ist? Kann ich da einfach die exe ins system32 Verzeichnis kopieren?



  • Nein, lass alles wie es ist und füge das Verzeichnis "bin" (dort wo deine g++/gcc.exe lebt) dem Pfad hinzu. Das machst du unter Arbeitsplatz->Eigenschaften->Erweitert->Umgebungsvariablen.
    Dort suchst du die Variable Pfad und gehst an das Ende der Zeile. Dort gibst du ein ; nach dem letzten Eintrag ein (falls da keines ist) und schreibst dort rein wo deine gcc.exe ist.
    Beispiel:

    C:\Programme\Perl\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\MinGW\Bakefile\src;**C:\MinGW\bin;**C:\Programme\ATI Technologies\ATI.ACE\Core-Static;C:\Programme\Visual Leak Detector\bin;C:\Mingw\NaturalDocs-1.35;C:\WINDOWS\system32\WindowsPowerShell\v1.0

    So schaut das bei mir aus.



  • Ok, danke für deine Bemühungen: also jetzt : wenn ich deine dll_bauen in deinem beispiel ordner ausführe ensteht eine a.exe und eine libTest.a
    Wnn ich dein programm bauen ausführe entsteht eine Test.exe, die auch funktioniert.

    So jetzt habe ich das in den ordner mit meinen scripts verschoben und die dll_bauen folgendermaßen angepasst:

    g++ Dll_aufruf.cpp -WALL -L./ -lAutoentpackerDLL -o test.exe
    

    und es passiert im Endeffekt gar nichts, ausser das son cmd fenster einmal kurz aufblinkt, es entsteht keine test.exe oder so



  • Schick mir das Projekt bitte per EMail:
    scorcher24 antispamat gmail antispamdot com
    Dann schreib ich dir nen Bakefile oder nen script...
    rya.



  • nach dieversen Versuchen muss ich dir jetzt mitteilen, dass ich nicht in der Lage war deine e-mailadresse aus diesem Geschreibsel "scorcher24 antispamat gmail antispamdot com" zu extrahieren hier ein paar fehlgeschlagene Versuche:
    scorcher24antispam@gmail.com
    scorcher24antispam@gmailaintispam.com
    antispam@gmail.com
    antispam@gmailantispam.com
    scorcher24@gmail.com
    scorcher24@gmailantispam.com
    Und noch einige mehr habe ich versucht, könntest du deine e-mail adresse also bitte so schreiben, dass ich in der Lage bin sie zu erkennen 😕
    Danke



  • Ok, danke hat sih erledigt, nach dem ganzen scheiß habe ich einfach den Borland-Compiler genommen, und dann gings wunderbar, danke für eure bemühungen.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten