dll Bibliothek



  • Hi,

    Ich hab mehrere Klassen und Funktionen geschrieben die ich gerne in eine dynamische Bibliothek packen will. Leider weiss ich garnicht wie das geht. Hab auch gegoogelt aber irgendwie nichts brauchbares gefunden. HOffe ihr könnt mir weiterhelfen.

    MFG KravenZ



  • Ich schätz mal, du verwendest das Microsoft Visual Studio?
    Hier die Erklärung vür MSVS 2003:

    Dann erstellst du ein neues Projekt für eine DLL:

    [Datei] -> [Neu] -> [Projekt...] ( Ctrl + Shift + N )

    Im folgenden Dialog:

    [Projekttypen:] -> [Visual C++-Projekte]
    [Vorlagen:] -> [Win32-Projekt]
    [Name:] -> {dein .dll-Name}

    Im folgenden Dialog:

    [Anwendungseinstellungen]
    -> [Anwendungstyp:] -> [DLL]
    -> [Zusätzliche Optionen:] -> [Leeres Projekt]

    Nun hast du ein leeres DLL-Projekt.

    [Projektmappen-Explorer] -> {dein .dll-Name} -( Rechtsklick )-> [Eigenschaften]

    Im folgenden Dialog, im Tree (links)

    [Konfigurationseigenschaften] -> [C/C++] -> [Präprozessor] -( rechts weiter )-> [Präprozessordefinitionen]
    "{dein .dll-Name}_EXPORTS" (ohne Anführungszeichen) hinzufügen.
    [Konfiguration:] -( dropdown, oben )-> [Release]
    nochmal "{dein .dll-Name}_EXPORTS" (ohne Anführungszeichen ) in [Präprozessordefinitionen] hinzufügen.
    [OK]

    [Projektmappen-Explorer] -> {dein .dll-Name} -> [Quelldateien] -( Rechtsklick )-> [Hinzufügen] -> [Neues Element hinzufügen...]

    Im folgenden Dialog:

    [Name:] -> "{dein.dll-Name}.cpp" ( ohne Anführungszeichen ) eintragen.
    [OK]

    [Projektmappen-Explorer] -> {dein .dll-Name} -> [Headerdateien] -( Rechtsklick )-> [Hinzufügen] -> [Neues Element hinzufügen...]

    Im folgenden Dialog:

    [Name:] -> "{dein.dll-Name}.h" ( ohne Anführungszeichen) eintragen.
    [OK]

    in {dein.dll-Name}.h:

    #ifdef {dein.dll-Name}_EXPORTS
    #define {dein.dll-Name}_API __declspec(dllexport)
    #else
    #define {dein.dll-Name}_API __declspec(dllimport)
    #endif
    
    extern {dein.dll-Name}_API int test_var;
    {dein.dll-Name}_API int test_fnct( void );
    

    in {dein.dll-Name}.cpp:

    #include <windows.h>
    #include "{dein.dll-Name}.h"
    
    BOOL APIENTRY DllMain( HANDLE module, DWORD  ul_reason_for_call, LPVOID reserved )
    {
        switch (ul_reason_for_call)
        {
            case DLL_PROCESS_ATTACH:
            case DLL_THREAD_ATTACH:
            case DLL_THREAD_DETACH:
            case DLL_PROCESS_DETACH:
                break;
        }
        return TRUE;
    }
    
    // Dies ist das Beispiel einer exportierten Variablen
    {dein.dll-Name}_API int test_var = 0;
    
    // Dies ist das Beispiel einer exportierten Funktion
    {dein.dll-Name}_API int test_fnct( void )
    {
    	MessageBox( 0, "Test!", "DLL:", MB_OK );
    }
    

    ...und schon hab ich fertig!

    Greetz, Swordfish

    PS: Ach ja, mit Klassen wird's etwas komplizierter.



  • schon mal vielen dank. werde das jetzt versuchen. benutze aber visual c++ 6 autoren edition. naja da gibt es bestimmt änliche optionsbeschriftungen. vielleicht kriege ich es hin 🙂 klassen als dll würden mich eigentlich auch interessieren. kann man das irgendwo nachlesen?



  • Müsst unter 6.0 ähnlich laufen. Überleg dir, ob du dir nicht von MS das Visual Studio .NET 2005 Express laden solltest. Der Compiler ist um längen besser.

    Melde dich, wenn du diese DLL erfolgrich compilieren konntest.
    Versuche die test_var aus einer anderen App heraus zu ändern und die test_fnkt() aufzurufen.
    Dann unterhalten wir uns über class'es.

    Greetz, Swordfish



  • Ok hab jetzt eine dll Datei hingekriegt. Versuche die aber in ein neues Projekt einzubinden aber irgendwie will es nicht klappen.
    Hab ein neues Win32 Projekt als Anwendung erstellt.
    Dort eine WinMain funktion reingeschrieben.
    So, dann hab ich durch Projekt->dem Projekt hinzufügen->Dateien: dem Projekt die Headerdatei aus dem Dll Projekt hinzugefügt. Wenn ich dann nur zum testen Ausführen will sagt mir Visual c++ folgendes:
    "Include-Datei kann nicht geoeffnet werden: 'Test.h': No such file or directory"
    Dann hab ich die Headerdatei einfach ausserhalb von Visual C++ vom DllProjektOrdner in den Projektordner des neuen Projekts kopiert. Jetzt wird die Datei gefunden.
    Jetzt schreibe ich in die WinMain Funktion den Funktionsnamen rein und versuche auszuführen doch dann kommt folgender Fehler:
    "TestMain.obj : error LNK2001: Nichtaufgeloestes externes Symbol "__declspec(dllimport) int __cdecl testFunc(void)" (__imp_?testFunc@@YAHXZ)
    Debug/DllTesten2.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise"
    Hab die .dll mal auch in den neuen Projektordner kopiert. hat aber auch nicht geholfen. jetzt weiss ich leider nicht mehr weiter.

    PS: Wollte mir eigentlich auch schon Visual Studio .NET 2005 express laden aber hab gelesen daß man da noch sehr viel selber einstellen muß damit das richtig funktioniert. Hab dafür bis jetzt noch keine Tutorial gefunden.



  • Entschuldige, bin kurz eingenickt... 😉
    Du musst natürlich dem Linker sagen, daß er zur test.dll Linken soll. im test\debug bzw. test\release ordner sollte sich eine test.lib finden. Diese kopierst du in den Projektordner deiner Testapplikation und fügst sie unter den [Projekteigenschaften] -> [Linker] -> [Eingabe] hinzu.

    HIH
    Greetz, Swordfish



  • Ok super das klappt schon mal perfekt.

    Kommen wir jetzt zu Klassen ^^

    PS: Hab mir in der zwischenzeit Visual Studio C++ 2005 Express installiert aber da kann man nichtmal Win32-Anwendungen erstllen. Ich kann dort nur Konsolenanwendungen erstellen.



  • Ok, Klassen.
    Bei Klassen musst du eine pure virtual Basisklasse (Interface) haben, welche sowohl in DLL als auch in deiner Application bekannt ist. In der DLL leitest du dann die eigentliche Implementation davon ab und überschreibst alles virtuelle. Um diese Klasse zu instanziieren, benötigst du eine Funktion in der DLL, welche ein neues Objekt erstellt und einen Pointer darauf zurückgibt:

    /* unser Interface: */
    
    class ITestClass {
    
        public:
    
            virtual void test_method ( )  = 0;
            virtual void release( )       = 0;
    };
    
    /* die Implementation: */
    
    class CTestClass : public ITestClass {
    
        public:
    
            CTestClass( ) { };
            ~CTestClass( ) { };
    
            virtual void test_method( );
            virtual void release( );
    };
    
    void CTestClass::release( )
    {
        delete this;
    }
    
    void CTestClass::test_method( )
    {
        MessageBox( 0, "CTestClass::test()", "DLL:", MB_OK );
    }
    
    /* Die einzige Funktion, welche exportiert wird: */
    
    TEST_API ITestClass* GetTestClassInterface( void )
    {
        return dynamic_cast< ITestClass* >( new CTestClass() );
    }
    

    Greetz, Swordfish



  • ok das werde ich dann später mal ausprobieren. bin jetzt ziemlich müde und lege mich gleich schlafen ^^ aber schon mal vielen vielen dank.

    PS: Mit Visual C++ express kannst du mir wohl auch nich weiterhelfen oder? also warum ich da keine Win32 Anwenundungen etc erstellen kann.


Anmelden zum Antworten