Hook funktioniert nicht



  • Hallo,

    ich habe genau nach dem Hook-DLL-Code auf http://www.c-plusplus.net/forum/viewtopic-var-t-is-39383.html
    eine DLL erstellt. Wenn ich SetupHook jetzt aber in meinem Programm verwende, funktioniert das einfach nicht, das heißt, ich habe in der DLL noch etwas dazugeschrieben:

    [...]
    EXPORT BOOL CALLBACK SetupHook (HWND hParent){
        hWindow = hParent ;
        hhkHook = SetWindowsHookEx (WH_KEYBOARD, KeyboardHookProc, hDllInstance, 0);
        if(hhkHook==NULL)
        {
                         MessageBox(hParent, "Hook konnte nicht installiert werden.", "Fehler", MB_OK);
                         return FALSE;
        }
        return TRUE ;
    }
    [...]
    

    so. und jetzt kommt immer diese MessageBox in meine Programm, also funktioniert das irgendwie nie richtig... Ich habe von einem anderen heruntergeladenen Programm einen Quellcode, wo auch ein Hook verwendet wird und der Quellcode für den Hook ist eigentlich ziemlich der gleiche. Als ich dann die dem Programm beiliegende DLL statt der selbst erstellten für mein Programm verwendet habe, hat es perfekt funktioniert. Und als ich dann eine DLL mit dem Quellcode des anderen Programms erstellt und diese dann mit meine Prog verwendet hab, ist es wieder nicht gegangen. 😡 So langsam denk ich schon, es liegt an meinem Compiler. Ich benute Dev-C++ 4.9.9.2 und WinXP. Bin dankbar für jede Antort!! 🙂



  • dann haste irgendwo anders n schlenker eingebaut, musst schon ma mit mehr code rausrücken wie und wo lädst du die dll und rfust setuphook auf und so weiter



  • das ist ja genau mein problem - wenn ich die originale DLL verwende, die bei dem Programm kompiliert dabei war und so in mein programm reinlade, dann funkioniert alles perfekt genau so wie es funktionieren soll. Aber wenn ich jetzt selbst mit Dev-Cpp eine DLL erstell - nach dem selben Quelltext der bei der DLL des Programms verwendet wurde - und diese DLL dann in mein Programm lade - gehts plötzlich nicht mehr... ich hab alles genauso gemacht wie im Quellcode des Programms:

    [...]
    case WM_CREATE:
                 {
                           HINSTANCE HookDLL = LoadLibrary("hook.dll");
                           if(HookDLL==NULL)
                           {
                                            MessageBox(0, "Error loading DLL.", "", MB_OK | MB_SYSTEMMODAL);
                                            return -1;
                           }
    
                           typedef BOOL (*SETUPHOOKPROC)(HWND hParent);
    		               SETUPHOOKPROC CreateHook = NULL;
    		               CreateHook = (SETUPHOOKPROC)GetProcAddress(HookDLL,"SetupHook"); 
    
    		               if(CreateHook(hwnd)==FALSE)
    		               {
                              MessageBox(0, "Error installing Hook", "", MB_OK | MB_SYSTEMMODAL);
                              return -1;
                           }
                           return 0;
                 }
    [...]
    

    tja und bei meiner selbst kompilierten DLL kommt - wie gesagt - immer "Error installing hook" aber bei der anderen runtergeladenen nicht. Die DLL selbst wird übrigens fehlerfrei geladen.



  • was hast du denn an deiner hook-DLL geändert?
    vieleicht den namen der Funktion "SetupHook" in der DLL?

    oder hast du nichts geändert??



  • eigentlich hab ich garnix geändert und hab auch einige andere variationsmöglichkeiten durchprobiert aber mit der selbstkompilierten DLL funktionierts einfach nicht. deswegen glaub ich ja auch schon dass das am compiler liegt... was könnte es denn sonst sein? hier jedenfalls mal der quellcode der DLL (der originalen, den ich dann halt nur selbst noch kompilier):

    // hookdll.h 
    
    #ifdef __cplusplus 
    #define EXPORT extern "C" __declspec (dllexport) 
    #else 
    #define EXPORT __declspec (dllexport) 
    #endif 
    
    EXPORT BOOL SetupHook (HWND) ; 
    EXPORT BOOL UninstallHook (void) ; 
    LRESULT CALLBACK KeyboardHookProc (int, WPARAM, LPARAM) ; 
    LRESULT CALLBACK MouseHookProc (int nCode, WPARAM wParam, LPARAM lParam);
    

    und hier dann die maindatei:

    #include <windows.h> 
    #include "hook.h"    
    #include <stdio.h>
    #include <fstream.h>
    #pragma data_seg ("Shared") 
    HWND hWindow = 0 ; 
    #pragma data_seg () 
    #pragma comment (linker, "/section:Shared,RWS") 
    
    HHOOK       hhkHook ;
    HHOOK       hhmHook ;
    HINSTANCE   hDllInstance ; 
    
    #define HOOK_KEYDOWN	 (WM_USER+2)
    #define HOOK_KEYUP		 (WM_USER+3)
    #define HOOK_MOUSE		 (WM_USER+4)
    
    int APIENTRY DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved){ 
        switch (fdwReason){ 
            case DLL_PROCESS_ATTACH : 
                // Die DLL wird in den Adressraum des aktuellen Prozesses 
                // eingeblendet. 
                hDllInstance = hInstance ; 
                // Initialisierung der globalen Variable 
                break ; 
        }    
    
        return TRUE ; 
    } 
    
    EXPORT BOOL SetupHook (HWND hParent)
    { 
        hWindow = hParent ;
    
        // Hooks erstellen
    	hhkHook = SetWindowsHookEx (WH_KEYBOARD, KeyboardHookProc, hDllInstance, NULL) ; 
        hhmHook = SetWindowsHookEx (WH_MOUSE,	 MouseHookProc,	   hDllInstance, NULL) ; 
    
    	if (hhkHook == NULL || hhmHook == NULL)
    		return FALSE;
        return TRUE ; 
    } 
    
    LRESULT CALLBACK MouseHookProc (int nCode, WPARAM wParam, LPARAM lParam)
    {
    	if (nCode == HC_ACTION)
    	{
    		MOUSEHOOKSTRUCT * info = (MOUSEHOOKSTRUCT*)lParam;
    		PostMessage(hWindow,HOOK_MOUSE,wParam,MAKELPARAM(info->pt.x,info->pt.y));
    		return CallNextHookEx (hhmHook, nCode, wParam, lParam) ; 
    	}
    	return FALSE;
    }
    
    LRESULT CALLBACK KeyboardHookProc (int nCode, WPARAM wParam, LPARAM lParam)
    { 
    	if (nCode == HC_ACTION)
    	{
    			//KEYUP oder KEYDOWN ?
    			if ((lParam & 0x100000000) == 0)
    			{
    				PostMessage(hWindow,HOOK_KEYDOWN,wParam,0);
    
    			}
    			else
    			{
    				PostMessage(hWindow,HOOK_KEYUP,wParam,0);
    			}
    		// Die Nachrichten an den nächsten Hook weiterreichen. 
    		return CallNextHookEx (hhkHook, nCode, wParam, lParam) ; 
    	}
    	return FALSE;    
    } 
    
    EXPORT BOOL UninstallHook (void)
    { 
        UnhookWindowsHookEx (hhkHook) ; 
    	UnhookWindowsHookEx (hhmHook) ; 
        return TRUE ; 
    } 
    
    /////////////////////////////////////////////////////////////////////
    

    🙄



  • Liegt bestimmt an deinem komischen Compiler. Wieso benutzt du nicht Visual Studio 2005 Express, ist schliesslich umsonst! Ansonsten schau mal mit Dependency Walker ob SetupHook auch echt als SetupHook exportiert wird.

    MfG,
    *Ranner*



  • danke habs mir jetz mal runtergeladen komm aber bis jetz nicht richtig klar damit... naja ich schau mal bei fragen sag ich was^^



  • Und dein Hauptprogramm? Wie sieht da der Code aus? Wie definierst du die Hook-Funktionen?



  • steht ja eigentlich weiter oben oder?? außerdem kanns daran nicht liegen weils mit einer fertigen, nicht von mir erstellten DLL ja funktioniert...



  • kingofmovies schrieb:

    steht ja eigentlich weiter oben oder??

    Nein...



  • das ist das hauptprog obwohl ich eigentlich mein dass der hauptteil dazu oben steht weil der rest eigentlich so wie bei jedem normalen windows-programm ist:

    #include <windows.h>
    
    #define HOOK_KEYDOWN     (WM_USER+2)
    #define HOOK_KEYUP         (WM_USER+3)
    #define HOOK_MOUSE         (WM_USER+4)
    
    /*  Declare Windows procedure  */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);
    
    /*  Make the class name into a global variable  */
    char szClassName[ ] = "HookFunction";
    
    int WINAPI WinMain (HINSTANCE hThisInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpszArgument,
                        int nFunsterStil)
    
    {
        HWND hwnd;               /* This is the handle for our window */
        MSG messages;            /* Here messages to the application are saved */
        WNDCLASSEX wincl;        /* Data structure for the windowclass */
    
        /* The Window structure */
        wincl.hInstance = hThisInstance;
        wincl.lpszClassName = szClassName;
        wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
        wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
        wincl.cbSize = sizeof (WNDCLASSEX);
    
        /* Use default icon and mouse-pointer */
        wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
        wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
        wincl.lpszMenuName = NULL;                 /* No menu */
        wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
        wincl.cbWndExtra = 0;                      /* structure or the window instance */
        /* Use Windows's default color as the background of the window */
        wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
    
        /* Register the window class, and if it fails quit the program */
        if (!RegisterClassEx (&wincl))
            return 0;
    
        /* The class is registered, let's create the program*/
        hwnd = CreateWindowEx (
               0,                   /* Extended possibilites for variation */
               szClassName,         /* Classname */
               "Hook",       /* Title Text */
               WS_OVERLAPPEDWINDOW, /* default window */
               CW_USEDEFAULT,       /* Windows decides the position */
               CW_USEDEFAULT,       /* where the window ends up on the screen */
               544,                 /* The programs width */
               375,                 /* and height in pixels */
               HWND_DESKTOP,        /* The window is a child-window to desktop */
               NULL,                /* No menu */
               hThisInstance,       /* Program Instance handler */
               NULL                 /* No Window Creation data */
               );
    
        /* Make the window visible on the screen */
        ShowWindow (hwnd, nFunsterStil);
    
        /* Run the message loop. It will run until GetMessage() returns 0 */
        while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    
        /* The program return-value is 0 - The value that PostQuitMessage() gave */
        return messages.wParam;
    }
    
    /*  This function is called by the Windows function DispatchMessage()  */
    
    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        switch (message)                  /* handle the messages */
        {
            case WM_DESTROY:
                 PostQuitMessage(0);
                 break;
            case HOOK_KEYDOWN:
                 {
                           MessageBox(hwnd, "Taste gedrückt", "Info", MB_OK);
                           break;
                 } 
            case WM_CREATE:
                 {
                           HINSTANCE HookDLL = LoadLibrary("hook.dll");
                           if(HookDLL==NULL)
                           {
                                            MessageBox(0, "Error loading DLL.", "", MB_OK | MB_SYSTEMMODAL);
                                            return -1;
                           }
    
                           typedef BOOL (*SETUPHOOKPROC)(HWND hParent);
                           SETUPHOOKPROC CreateHook = NULL;
                           CreateHook = (SETUPHOOKPROC)GetProcAddress(HookDLL,"SetupHook");
    
                           if(CreateHook(hwnd)==FALSE)
                           {
                              MessageBox(0, "Error installing Hook", "", MB_OK | MB_SYSTEMMODAL);
                              return -1;
                           }
                           return 0;
                 }
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    

Anmelden zum Antworten