frage: dll load



  • fogende zusammenfassung von mir, weiss ich ob die richtig ist:
    dll muss man immer dynamisch link, es gibt keine statisch gelinkte dlls.
    man redet nur von implizit od explizit linken.
    wenn man dll implizit linken will, braucht man 3 Datei. ".dll", ".lib", ".h"
    die funktionen in dll fangen mit __declspec().
    bei explizit linken muss die dll dllmain einbauen.
    wenn ich habe eine fremde dll, ohne .h und .lib, wie kann ich dann verwenden?



  • z.B. so

    typedef void __stdcall NSend(String Server,String Empf,String Abse,String Txt,int Len); 
    HINSTANCE h = LoadLibrary("netapi32.dll"); //weist der dll ein handle zu (h)
    NSend* NetS=(NSend*)GetProcAddress;
    

    wenns nie richtig ist bitte mal richtig stellen! ­čśâ hat aber funktioniert

    LoadLibrary l├Ąd die dll und weist dem "h" das handle dieser zu. wenn die dll nicht geladen werden kann ist "h" =0 !

    GetProcAdress gibt dir den Zugriff auf die in der DLL vorhandene Funktion (h,"NetMessageBufferSend") ist diese funktion nicht vorhanden ist der wert 0 !



  • 1. war meine zusammenfassung richtig?
    2. muss ich mich auf welche einstellung von VC achten?
    z.B. muss ich dann dll zu project hinzuf├╝gen?



  • netrobot schrieb:

    1. war meine zusammenfassung richtig?

    Naja, so genau l├Ąsst sich das nicht sagen. Ist alles etwas konfus. ­čÖé

    [C++ Offtopic]

    netrobot schrieb:

    dll muss man immer dynamisch link, es gibt keine statisch gelinkte dlls.

    Das ist richtig. Deshalb heisst es ja auch Dynamic Link Library.
    Grunds├Ątzlich gibt es zwei Arten von Librarys, statische und dynamische. DLLs geh├Âren sozusagen zur dynamische Fraktion. Leider werden manchmal bei DLLs selbst die Begriffe statisch und dynamisch verwendet, und zwar wenn es um das Laden selbiger geht. Allerdings ist die Benutzung der Begriffe etwas irref├╝hrend. Besser ist da, von load time linking (implizit) und run time linking (explizit) zu sprechen.

    netrobot schrieb:

    wenn man dll implizit linken will, braucht man 3 Datei. ".dll", ".lib", ".h"

    Die .dll brauchst du immer, aber erst zur Laufzeit. F├╝rs Programmieren selbst sind lediglich .lib und .h von Interesse. Die .lib Datei wird allerdings nur beim impliziten Linken ben├Âtigt.

    netrobot schrieb:

    die funktionen in dll fangen mit __declspec()

    Was du uns damit sagen willst, ist mir ehrlich gesagt schleierhaft. __declspec(dllexport) verwendet man, um dem Compiler mitzuteilen, dass die Definition der Funktion in einer DLL stehen wird, und dass in der .lib Datei entsprechende Infos generiert werden sollen, damit das implizite Linken funktioniert. Notwendig ist __declspec(dllexport) aber nicht unbedingt, du k├Ânntest daf├╝r zB auch eine DEF Datei verwenden.

    netrobot schrieb:

    bei explizit linken muss die dll dllmain einbauen

    Nein, eine dllmain brauchst du immer. Denn egal ob du implizit oder explizit linkst, die DLL muss auf jedenfall geladen werden. Und dann kommt dllmain (oder wie immer du den Einsprungspunkt definierst) ins Spiel.

    netrobot schrieb:

    wenn ich habe eine fremde dll, ohne .h und .lib, wie kann ich dann verwenden?

    Gar nicht. Zumindest den Namen und die Signatur der verwendeten Funktionen musst du schon kennen.

    netrobot schrieb:

    2. muss ich mich auf welche einstellung von VC achten?
    z.B. muss ich dann dll zu project hinzuf├╝gen?

    Nein. Wie bereits erw├Ąhnt, ist die DLL Datei f├╝rs Programmieren selbst nicht von Bedeutung.

    [/C++ Offtopic]



  • vielen dank

    Nein, eine dllmain brauchst du immer. Denn egal ob du implizit oder explizit linkst, die DLL muss auf jedenfall geladen werden. Und dann kommt dllmain (oder wie immer du den Einsprungspunkt definierst) ins Spiel.

    ich habe eine API geschrieben, dann das ganze als eine dll. vor jeder funktion schieb ich nur declspec (dllexport) (ohne dllmain, was ich nur mal geh├Ârt, verstanden habe ich noch nicht).Danach habe ich einfach die entsprechende lib in projekt hinzuf├╝gt.Es l├Ąuft einwandfrei.wieso?? Es ist implizit link, also ohne dllmain.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Rund um die Programmierung verschoben.

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

    Dieses Posting wurde automatisch erzeugt.



  • netrobot schrieb:

    ich habe eine API geschrieben, dann das ganze als eine dll. vor jeder funktion schieb ich nur declspec (dllexport) (ohne dllmain, was ich nur mal geh├Ârt, verstanden habe ich noch nicht).Danach habe ich einfach die entsprechende lib in projekt hinzuf├╝gt.Es l├Ąuft einwandfrei.wieso?? Es ist implizit link, also ohne dllmain.

    Sry, da hab ich leider Bl├Âdsinn geschrieben. War mir bisher neu, dass dllmain optional ist.

    MSDN schrieb:

    The DllMain function is an optional entry point into a dynamic-link library (DLL). If the function is used, it is called by the system when processes and threads are initialized and terminated, or upon calls to the LoadLibrary and FreeLibrary functions.



  • dllmain ist nur f├╝r mfc da?



  • Nein. Das Konzept der Dynamic Link Libraries hat mit MFC erstmal nichts zu tun. Du kannst dllmain zB daf├╝r nutzen, um Ressourcen beim Laden zu allokieren und beim Entladen wieder freizugeben.



  • Bin bei der Suche f├╝r mein folgendes Problem auf dieses Forum gesto├čen. Hoffe mir kann jemand helfen.

    Ich habe eine Menge an Klssen mit zugeh├Ârigen Headern programmiert und will diese, bzw. das ben├Âtigte, nun in einer API mit DLL bereitstellen. declspec scheint nach allem was ich gelesen habe aber nur f├╝r Variablen, Konstanten und Funktionen zu funktionieren, aber nicht f├╝r Klassen und deren Methoden.
    Was mu├č ich tun, damit z.B. meine Singleton-Klasse Mainwindow in der API die Methode int Mainwindow::Init(.....); zur Verf├╝gung stellt?

    Bin f├╝r jede noch so kleine Hilfe dankbar, da dies meine erste API ist.

    Danke, Ralph



  • Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Rund um die Programmierung in das Forum WinAPI verschoben.

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

    Dieses Posting wurde automatisch erzeugt.


Log in to reply