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.


Anmelden zum Antworten