FreeDLL funktioniert nicht



  • Hi,bei folgendem Code wird die DLL nicht entladen,man kann sie also nicht löschen
    und sie wird weiterhin ausgeführt,weiß jamand an was das liegt?

    #include <windows.h>
    
    int main(void)
    {
    HINSTANCE hDLL;
    hDLL = LoadLibrary("hack_dll.dll");
    system("PAUSE");
    FreeLibrary(hDLL);
    return 0;
    }
    


  • was heisst sie wird weiterhin ausgeführt? was machst du in der dll? funzt bei mir ohne probs.



  • BOOL InstallHook(void);
    BOOL UnInstallHook(void);
    LRESULT CALLBACK MouseProc( int, WPARAM, LPARAM);
    
    HHOOK		hMouseHook;
    HINSTANCE   hDllInstance;
    
    extern "C" int WINAPI DllMain
                          (HINSTANCE hInst     /* Library instance handle. */ ,
                           DWORD reason        /* Reason this function is being called. */ ,
                           LPVOID reserved     /* Not used. */ )
    {
        switch (reason)
        {
          case DLL_PROCESS_ATTACH:
         	hDllInstance = hInst;
            InstallHook();
            break;
    
          case DLL_PROCESS_DETACH:
            UnInstallHook();
            break;
        }
    
        /* Returns TRUE on success, FALSE on failure */
        return TRUE;
    }
    
    BOOL  UnInstallHook(void)//CALLBACK
    {
       //MessageBox(GetForegroundWindow(),"inhalt","name",MB_OK);   
        return UnhookWindowsHookEx(hMouseHook);
    }
    
    BOOL  InstallHook(void)
    {
    
     	hMouseHook = SetWindowsHookEx(WH_MOUSE,
                                         MouseProc,
                                         hDllInstance,
                                         0);
    
        if (hMouseHook == NULL)
        {
    
            return FALSE;
        }
        MessageBox(GetForegroundWindow(),"inhalt","name",MB_OK);
        return TRUE;
    }
    
    LRESULT MouseProc( int code, WPARAM wparam, LPARAM lparam )
    {
    /*DWORD dwThreadParam = 1;
    DWORD dwThreadID;
    
    static HANDLE hThread;
      if( code >= 0 )
      {     
          MOUSEHOOKSTRUCT mhs = *(MOUSEHOOKSTRUCT*)lparam;
    
          if (mhs.hwnd == FindWindow( NULL, "Counter-Strike Source" ))
          {
            if( wparam == WM_LBUTTONDOWN )
            {
             hThread = CreateThread (NULL, 0, ThreadProc,
             &dwThreadParam, 0,
             &dwThreadID);
            }
            if( wparam == WM_LBUTTONUP )
            {
             TerminateThread (hThread, 0);   
            }
          }
    
      }
    */
    
    return CallNextHookEx(hMouseHook, code, wparam, lparam);
    
    }
    

    Das mach ich darin!
    Und naja sie wird weiter ausgeführt d.h. man kann sie nicht löschen 😮
    Außerdem kommt die Textbox in InstallHook(void) nach dem beenden manchmal...Warum kommt die überhaupt öfters als 1x?

    Danke im voraus



  • na das hat was mit deinem hook zeug zu tun...ich bin gerade zzu *faul* das in meinem buch nochmal nachzulesen, ich bin mir sicher jochen kann dir helfen, ansonsten schau ich nachher mal nach



  • Bin mir jetzt nicht sicher, aber vermutlich erhöht "SetWindowsHookEx" die Referenz auf die DLL, da ja sonst Dein Programm abstürzen würde/könnte, wenn die DLL entladen wird...



  • Du bist ein wandelndes Lexikon 😉
    Weißt du auch wie ich das ganze dann lös?

    Xalon



  • Da Deine Vorgehensweise soweiso nicht durch die Doku gedekt ist (Aufruf von SetWindowsHookEx in DllMain ist nicht supported! siehe Doku zu DllMain!), wäre der richtige Weg eine Funktion "init" und eine "deinit" zu machen, die man entsprechend aus der EXE heraus aufrufen muss.



  • Ok Danke.
    Habs jetzt so versucht:

    #include <windows.h>
    
    int main(void)
    {
    
    /**************************/
    /*DLL mit Funktionen laden*/
    /**************************/
    HINSTANCE hDLL;
    typedef BOOL (CALLBACK* LPFNDLLFUNC1)(void);
    LPFNDLLFUNC1 InstallHook; 
    LPFNDLLFUNC1 UnInstallHook; 
    hDLL = LoadLibrary("hack_dll.dll");
    UnInstallHook = (LPFNDLLFUNC1)GetProcAddress(hDLL,"UnInstallHook"); 
    InstallHook = (LPFNDLLFUNC1)GetProcAddress(hDLL,"InstallHook"); 
    /**************************/
    UnInstallHook();
    
    FreeLibrary(hDLL);
    return 0;
    }
    

    Und die DLL:

    #include <windows.h>
    #include "dll.h"
    
    LRESULT CALLBACK MouseProc( int, WPARAM, LPARAM);
    HHOOK		hMouseHook;
    HINSTANCE   hDllInstance;
    
    extern "C" int WINAPI DllMain
                          (HINSTANCE hInst     ,
                           DWORD reason        ,
                           LPVOID reserved      )
    {
    
        hDllInstance = hInst;
        return TRUE;
    }
    
    BOOL CALLBACK UnInstallHook(void)
    {
       MessageBox(GetForegroundWindow(),"inhalt","name",MB_OK);   
       return TRUE;
    }
    
    BOOL CALLBACK InstallHook(void)
    {
    
     	hMouseHook = SetWindowsHookEx(WH_MOUSE,
                                         MouseProc,
                                         hDllInstance,
                                         0);
    
        if (hMouseHook == NULL)
        {
    
            return FALSE;
        }
        MessageBox(GetForegroundWindow(),"inhalt","name",MB_OK);
        return TRUE;
    }
    
    LRESULT MouseProc( int code, WPARAM wparam, LPARAM lparam )
    {
    
    return CallNextHookEx(hMouseHook, code, wparam, lparam);
    
    }
    

    Nur sobald ich dann in der exe UnInstallHook(); aufrufe kommt so ein Fehler:

    "dll_aufrufen.exe hat ein Problem festgestellt und muss beendet werden!
    [Nicht senden][Senden]"

    Woher kommt das?Ich kann keinen Fehler finden ?

    Xalon

    P.S.:Die dll.h

    #ifndef Hook_H
    #define Hook_H
    
    #ifdef MAKE_DLL
    
    #ifdef __cplusplus
    #define LINKDLL extern "C" __declspec(dllexport)
    #else
    #define LINKDLL __declspec(dllexport)
    #endif // __cplusplus
    
    #else
    
    #ifdef __cplusplus
    #define LINKDLL extern "C" __declspec(dllimport)
    #else
    #define LINKDLL __declspec(dllimport)
    #endif // __cplusplus
    
    #endif // MAKE_DLL
    
    BOOL CALLBACK InstallHook(void);
    BOOL CALLBACK UnInstallHook(void);
    
    #endif // Hook_H
    


  • Du definierst zwar ein schönes LINKDLL-Makro, aber du benutzt es nicht. Und da du die Rückgabewerte von GetProcAddress nicht prüfst, knallt es eben.



  • Warum denn nicht?

    Ich binde dll.h doch ein und da ist auch alles drinnen,oder?
    Hmm ich hasse Fehlerhafte Tutorial Codes ...
    Ich hab das DLL Grundgerüst nämlich aus einem...

    Danke im voraus.



  • schreib das LINKDLL mal vor deine funktionen in der dll und in der h datei...



  • Vielen Dank euch allen,es funktioniert ohne Probleme 🙂 👍


Log in to reply