loadlibrary?



  • hi leute!
    wie kann ich eine dll dynamisch laden??
    irgendwas mit loadlibrary? wie schaut das aus die brauch ich ja nur in der main laden oder? dann beim forom destroy wieder freiben oder wie macht ma das??

    so irgendwie:????????

    char *Lib = "User32.dll";
    
    // DLL laden
    hmod = LoadLibrary(Lib);
    if(hmod == NULL)
    {
      printf("%s wurde nicht gefunden\n",Lib);
      return(-1);
    }
    
    // Freigeben der Dll, damit sie auch wieder aus dem
    // Speicher entfernt werden kann
    FreeLibrary(hmod);
    

    was ist da hmod ?

    mfg nike.



  • wie kann ich eine dll dynamisch laden??

    Der Code den du gepostet hast sollte funktionieren. Da fehlt aber noch die Deklaration von der Variable "hmod." Sollte so aussehen: HMODULE hmod;
    hmod bedeutet "Handle to Module". Ist also eine Variable, mit der nur Funktionen wie LoadLibrary, FreeLibrary etc. was anfangen können.

    Nachdem du eine Dll geladen hast solltest du unter Umständen verhindern, dass sie wieder geladen wird. Wenn das Programm terminiert, oder wenn du die Dll nicht mehr brauchst solltest du die Dll wieder freigeben...



  • habs nuns so:
    im create form hab ich:

    char *Lib = "User32.dll"; 
    
    // DLL laden 
    HMODULE hmod = LoadLibrary(Lib); 
    
    if(hmod == NULL) 
    { 
      printf("%s wurde nicht gefunden\n",Lib); 
      return(-1); 
    }
    

    im destroy form:

    // Freigeben der Dll, damit sie auch wieder aus dem 
    // Speicher entfernt werden kann 
    FreeLibrary(hmod);
    

    Wie kann ich verhindern, wenn die dll schon geladen ist, dass sie nicht wieder geladen wird, wenn das programm eventuell terminiert???
    ich benutze ab und zu borland builder...müsste der code auch da klappen oder?

    cu nike.



  • Wie kann ich verhindern, wenn die dll schon geladen ist, dass sie nicht wieder geladen wird, wenn das programm eventuell terminiert???

    Auf diese Weise:

    HMODULE hmod;
    
    if(!GetModuleHandle(Lib))
      hmod = LoadLibrary(Lib);
    

    Ich verstehe nicht genau was du meinst mit "wenn das programm eventuell terminiert".



  • ja wenn das programm das die dll dynamisch ladet .....vielleicht mal abstürzt und es nicht zu freelibrary kommt....so mein ich das..
    thx..

    cu



  • im form load:
    
    char *Lib = "macromedia.dll";  
    
    // wenn die dll schon geladen ist, verhindern das die dll nochmal geladen wird
    // dafür is das GetModuleHandle da...
    if(!GetModuleHandle(Lib)) 
    {
      // DLL laden  
      HMODULE hmod = LoadLibrary(Lib);  
    
      if(hmod == NULL)  
      {  
        printf("%s wurde nicht gefunden\n",Lib);  
        return(-1);  
      }
    }
    
    im destroy form:
    // Freigeben der Dll, damit sie auch wieder aus dem  
    // Speicher entfernt werden kann  
    FreeLibrary(hmod);
    

    müsste alles passen?;-)
    danke dir mal!!

    cu 😃



  • Windows räumt auf wenn deine Anwendung plötzlich abbricht. D.h. alle Speicher Ressourcen, inklusive Threads und DLL's werden frei gegeben (denke ich mal).

    Deshalb wäre es sinnlos zu überprüfen ob die DLL bereits geladen ist oder nicht..



  • Der Code sollte passen. Aber eine Frage stellt sich mir. Da steht ja "im form load" und "im destroy" form. Sind das getrennte Funktionen? Kommt die hmod Variable auch sicher dort hin?



  • im form load: 
    
    char *Lib = "macromedia.dll";   
    
    // wenn die dll schon geladen ist, verhindern das die dll nochmal geladen wird 
    // dafür is das GetModuleHandle da... 
    if(!GetModuleHandle(Lib))  
    { 
      // DLL laden   
      HMODULE hmod = LoadLibrary(Lib);   
    
      if(hmod == NULL)   
      {   
        printf("%s wurde nicht gefunden\n",Lib);   
        return(-1);   
      } 
    } 
    
    im destroy form: 
    // Freigeben der Dll, damit sie auch wieder aus dem   
    // Speicher entfernt werden kann   
    HMODULE hmod
    FreeLibrary(hmod);
    

    hatte die HModul hmod im destroy form vergessen;-)

    cu, thx n omal! 👍



  • moin meister ...

    wie ist es wenn Du mal hMode als Klassenvariable anlegst.

    So wie Du es machst ist hMode bei FreeLibrary nicht initalisiert, und schon
    garnicht durch LoadLibrary ...

    Die dll wird so nicht freigegeben.

    Klasse Form:
    private:
    HMODULE hmod;

    in den Mothoden dann nur noch
    ...
    // HMODULE hmod = LoadLibrary(Lib); weg damit
    hmod = LoadLibrary(Lib); // richtiger

    // Freigeben der Dll, damit sie auch wieder aus dem
    // Speicher entfernt werden kann
    // HMODULE hmod - weg damit !!!
    FreeLibrary(hmod);

    mfg
    RB


Anmelden zum Antworten