DLL schreiben unter C



  • Kann es sein das bei Dev++ ein linker schon eingebaut ist.



  • Ja, jede IDE hat heutzutage einen Linker 🙂

    MfG SideWinder



  • Und ich suche einen im Internet. 🙄

    Da sieht man wie wenig ahnung ich in diesem Thema habe.



  • Eine kleine Einführung in die Weiten der Programmerstellung:

    Der von dir geschriebene Quellcode wird zuerst auf syntaktische Korrektheit geprüft (meistens mit Hilfe eines Syntaxbaumes). Wenn diese passt, generiert der Compiler zu jeder Datei Code. Neuere Compiler weisen dich heutzutage auch bereits auf manche semantische Fehler hin (= statt ==, Casting-Probleme, etc.) und optimieren den erzeugten Code auf Wunsch.

    Die ganzen generierten Code-Teile müssen nun aber zu einem großen Programm zusammengefügt werden. Diese Tätigkeit übernimmt der Linker. Er bindet zusätzlich auch noch einige Standard-Libraries hinzu (damit zum Beispiel auch der Code für Standardbibliotheken wie iostream vorhanden ist).

    Du kannst auf Wunsch noch weitere statische Libraries hinzulinken. Diese hast du zB vorher bereits geschrieben. Damit sich der Compiler auskennt hast du eine .h-Datei erzeugt, den dahinterstehenden Code sieht der Compiler allerdings nicht mehr, er kommt aus der fix und fertigen statischen Library und wird vom Linker hinzugefügt.

    Dynamische Libraries sind noch eine Ebene höher. Sie werden erst zur Laufzeit geladen. Um das meiste kümmert sich das Betriebssystem - du gibst im Wesentlichen nur bekannt, dass du eine dynamische Library laden möchtest und diese oder jene Funktion darin aufrufen möchtest.

    Damit der Linker sich nicht beschwert, dass manche Funktionen noch gar nicht vorhanden sind (woher soll er auch riechen, dass die erst zur Laufzeit geholt werden) kann man statische Libraries dazuerstellen lassen (zB macht das der VC), diese tun im Prinzip nichts anderes als Code zur Verfügung zu stellen der die dynamische Version davon lädt.

    Den ganzen Lade-Code, etc. übernimmt dir also im Prinzip bereits jemand anderes. Für dich sind es im Hauptprogramm nur noch 2, 3 Aufrufe und schon greifst du auf eine DLL zu - und das nicth nur mit der Sprache die du für die Erstellung der DLL benützt hast, sondern mit jeder Sprache die DLLs unterstützt.

    Eine DLL erstellen ist dann im Wesentlichen auch sehr einfach. Du machst das Gleiche wie bei einer statischen Library. Bloß hast du eine standardmäßig festgelegte Funktion DllMain die beim Laden, Entladen, Öffnen, etc. mit unterschiedlichen Parametern aufgerufen wird (da kannst du dann zB Initialisierungen erledigen, etc.)

    Im Gegensatz zur statischen Library ist der Code jetzt aber nicht in der .exe-Datei (Dort befindet sich nur der Lade-Code für die dynamische Version) sondern in einer .dll-Datei. Diese kannst du bequem updaten, in anderen Projekten verwenden, ja sogar gleichzeitig in mehreren Programmen aufrufen.

    MfG SideWinder



  • Ich kenn mich mit abkürzungen noch nicht ganz aus was ist VC.
    Das mit denn DLL finde ich so toll weill ich mal ein simples Fragen programm hatte.
    Nun ich hatte dann aber nicht immer wieder vor alles abzuschreiben, Deshalb will ich nun mit DLLs lernen.Es wäre ein Großer vorteil für mich. 🙂

    Und noch was:Jetzt weiß ich wieso viele anwendung DLLs haben mit namen wie game,net,usw.Einfach nur zum updaten.Pracktisch. 🙂

    Danke für die vielen erklärungen.Jetzt muss ich nur noch ein bischen im netz suchen wie man sowas schreibt,befehle,usw.Ich hoffe ich ging nicht zu doll auf die nerven bei manchen.Weil ich leider noch keine ahrnung habe.Bin dabei in Windows erstmal nen Fenster hinzu kriegen.Aber Das Fragenprogramm soll in der Konsole erstmal laufen.oh ich schreib schon wieder so viel. 🙂

    danke.

    mfg.
    Stefan



  • die fragen kannst du doch in eine datei, z.B. xml datei packen??



  • Mit VC meint man im Allgemeinen die IDE von Microsoft (IDE = Integrated Development Environment, also Editor+Compiler+Linker+Projektverwaltung+Debugger+Mehr). Also den Visual C++.

    Was man alles zu schreiben hat findet man ganz gut hier: http://www.c-plusplus.net/forum/viewtopic-var-t-is-39394.html

    MfG SideWinder



  • Für was ist das hier?:

    BOOL WINAPI LibMain(HINSTANCE hDllInst, DWORD fdwReason, LPVOID lpvReserved)
    {
        switch (fdwReason) {
            case DLL_PROCESS_ATTACH:
                break;
            case DLL_PROCESS_DETACH:
                break;
        case DLL_THREAD_ATTACH:
            break;
        case DLL_THREAD_DETACH:
            break;
        }
        return TRUE;
    }
    


  • eine Funktion die besser DllMain heißen sollte 😉



  • achso alles klar.



  • Das ist die besagte Funktion mit der du in der DLL auf bestimmte Ereignisse reagieren kannst (vollständige Auflistung siehe MSDN). Aber ein einfaches "return TRUE" reicht zu Beginn meistens 🙂

    BTW: Ja, sollte DllMain() heißen, LibMain() ist afaik eine Abwandlung vom BCB.

    MfG SideWinder



  • achso dann kann ich es ja so übrnehmen.

    danke für antwort 🙂
    Ich geschlafen.

    mfg.
    Stefan



  • Ich häng' mich hier mal ran, k? 🙂

    Gibt es DLLs nur unter Windows, oder ist das ein Feature von C++ und universell einsetzbar?
    Ich frage deshalb, weil ich bisher immer nur in Verbindung mit Windows von DLLs gehört habe und ich unter Linux (oder anderen Systemen) noch nie entwickelt habe, so dass ich das auch nicht testen kann. 😞

    Ach so, nochwas:
    1. Ist es grundsätzlich vorzuziehen eine DLL implizit oder explizit zu laden?
    2. Beim impliziten laden wird zuerst im Programmverzeichnis gesucht, und anschließend im System32-Dir (soweit ich weiß), kann man hier dem Programm noch nen Parameter oder so mitgeben, wo zusätzlich gesucht werden soll? Evtl. beim Linken?



  • Bei Linux heißt das Shared Object, haben die Endung .so.



  • THX, ist aber im Prinzip das Gleiche und wird auch gleich gehandhabt, bzgl. des Ladens, etc., oder gibt es da Unterschiede?



  • Das Prinzip ist das Gleiche, aber um diese Libraries benutzen zu können muss man die Betriebssystemfunktionen aufrufen. Das ist kein Teil von C++.

    Unter Windows: LoadLibrary, GetProcAddress, FreeLibrary
    Unter Linux: dlopen, dlsym, dlclose



  • Alles klar, vielen Dank!



  • Also die DLL krieg ich hin aber das Programm was dies benutzen soll will nicht compilliert werden.

    Ich weiß jetzt nicht weiter hier der quellcode:

    #include <windows.h>
    
    void DllFunction1(LPSTR message);  /* Sollte in einer *.h Datei stehen */
    
    int APIENTRY WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpCmdLine, int nCmdShow)
    {
        DllFunction1("Hello World 1!");
        return 0;
    }
    

    Fehlermeldung:
    | [Linker error]undefined reference to 'DllFunction1'
    | Id returned 1 exit status
    C:\...\Makefile.win| [Build Error][Fragenprogramm.exe]Error 1

    Kann mir jemand helfen?
    Ich hab schon die DLL in das verzeichniss vom Projekt.Hat nichts geändert. 😞



  • Hast du die lib der DLL mitgelinkt?



  • Die Definition im Header alleine reicht nicht, das reicht nur für den Compiler, der beschwert sich ja auch nicht. Sieht so aus, als wenn Du 2 Möglichkeiten hast.

    • Du erzeugt zusätzlich zu der DLL eine Statische Lib und linkst Dein Projekt mit dieser statischen Lib, dann brauchst Du Dich nicht um das Laden der DLL kümmern, dann muss die DLL entweder im gleichen Verzeichnis liegen, wie die exe, oder im Windows-, oder System32-Verzeichnis, oder
    • Du kümmerst Dich selbst darum, dass die DLL geladen wird, musst dann aber explizit jede Funktion laden.
    typedef void (*fnptr)(LPSTR);
    
    int APIENTRY WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpCmdLine, int nCmdShow)
    {
        HMODULE myLib = NULL;
        fnptr myfn = NULL;
    
        myLib = LoadLibrary("mydll.dll");
    
        if (myLib == NULL)
            MessageBox (NULL, "Fehler beim Laden der DLL", "Error", MB_OK);
        else {
            myfn = (fnptr)GetProcAddress(myLib, "name_of_function");
            if (myfn == NULL)
                MessageBox (NULL, "Fehler beim Laden der Funktion", "Error", MB_OK);
            else {
                (*myfn)("Hello World!");
            }
        }
        FreeLibrary (myLib);
        return 0;
    }
    

    ACHTUNG: ungetestet !!!

    Ich habe bisher noch nicht viel mit DLLs gemacht, aber bisher immer die erste Variante genommen und bisher lief das top.


Anmelden zum Antworten