maddin Geschrieben 16. Juli 2003 Geschrieben 16. Juli 2003 Hallo, ich habe folgendes Programm: meine Dll: #define WINVER 0x501 #define _WIN32_WINNT 0x501 #include <windows.h> HINSTANCE g_hInstance; HHOOK g_hHook; BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID) { switch(dwReason) { case DLL_PROCESS_ATTACH: g_hInstance = hInstance; break; case DLL_THREAD_ATTACH: g_hInstance = hInstance; break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return TRUE; } LRESULT HookProc(int nCode, WPARAM wParam, LPARAM lParam) { return CallNextHookEx(g_hHook, nCode, wParam, lParam); } BOOL InstallHook() { g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)HookProc, g_hInstance, 0); return g_hHook != NULL; } mein Programm: #define WINVER 0x501 #define _WIN32_WINNT 0x501 #include <windows.h> typedef BOOL (*InstallHook)(); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int) { HMODULE hDll = LoadLibrary("SysMnuExtDll.dll"); InstallHook ProcAdd = (InstallHook)GetProcAddress(hDll, "InstallHook"); ProcAdd(); for (int i = 0; i < 30; i++) Sleep(1000); FreeLibrary(hDll); return 0; } Das Problem ist, dass meine Hook Funktion nicht aufgerufen wird. Weiß vielleicht jemand warum? Zitieren
SirLizium Geschrieben 17. Juli 2003 Geschrieben 17. Juli 2003 Woran merkst du, dass die Hook-Funktion nicht aufgerufen wird? Wenn du damit diese Funktion meinst: LRESULT HookProc(int nCode, WPARAM wParam, LPARAM lParam) { return CallNextHookEx(g_hHook, nCode, wParam, lParam); } dann würde ja eh nicht viel passieren da die Ereignisse (meinem Verständnis nach) nur an den nächsten Hook weitergereicht werden... Zitieren
Diablo999 Geschrieben 17. Juli 2003 Geschrieben 17. Juli 2003 Hi Ich kann leider nicht direkt auf deine Frage antworten. Lass mal in der DllMain des InstanceHandle in ne Datei protokolieren, weil mich würds mal interessieren wie oft die DLL geladen wird. Bei nem Systemweiten Hook in alle Prozessräume? Oder etwa sogar in den Speicherbereich des Systems? Protokolier das mal mit, wenn mehrere Instanzen deiner DLL geladen werden kanns sein das deine CallNextHookEx nicht funktioniert weil du dir dein HANDLE nur in der aktuellen Instanz merkst, aber nicht in allen, da brauchst nen SharedMem Bereich. Und protokolier doch mal in ne Datei mit ob deine Hook-prozedur aufgerufen wird. Wenn du versuchst mit dem Debugger da stehenzubleiben wirst du scheitern, aber du kannst nen Interrupt 3 aufrufen, dann holt das System den Debugger automatisch... Hoffe das hilft dir ein wenig... Gruß Diablo999 Zitieren
Diablo999 Geschrieben 17. Juli 2003 Geschrieben 17. Juli 2003 Noch was... Du solltest unbedingt UnhookBlaBla aufrufen, snsonsten musst neu booten um den Hook wegzubekommen... Zitieren
maddin Geschrieben 18. Juli 2003 Autor Geschrieben 18. Juli 2003 Ich hatte an diversen Stellen im Programm und in der Dll einen Aufruf der Funktion "OutputDebugString("Aufruf blablabla\n"); eingefügt, um zu merken, ob die Funktionen aufgerufen werden oder nicht. Dabei kam heraus, das die DllMain einmal, die Funktion InstallHook ebenfalls einmal und eben die HookProc keinmal aufgerufen wurde. Zitieren
Guybrush Threepwood Geschrieben 18. Juli 2003 Geschrieben 18. Juli 2003 Ruf mal nach SetWindowsHookEx() GetLastError() auf und gib das aus. Zitieren
maddin Geschrieben 20. Juli 2003 Autor Geschrieben 20. Juli 2003 Ein Aufruf von GetLastError nach dem Aufruf von SetWindowsHookEx gibt 6 zurück (ungültiger Handle). Damit kann ja nur g_hInstance gemeint sein, oder???. Wie kann ich das Problem den umgehen? Hat jemand eine Lösung? Zitieren
Guybrush Threepwood Geschrieben 21. Juli 2003 Geschrieben 21. Juli 2003 Laß mal in deiner DLLMain das switch weg und schreib nur g_hInstance = hInstance; Zitieren
maddin Geschrieben 21. Juli 2003 Autor Geschrieben 21. Juli 2003 Hat das Problem nicht gelöst. Zitieren
idefix Geschrieben 22. Juli 2003 Geschrieben 22. Juli 2003 vieleicht wirst du hier fündig www.codeproject.com/dll/keyboardhook.asp dir fehlt wahrscheinlich einmal __declspec(dllexport)__stdcall und (viel wichtiger) #pragma data_seg für g_hHoook,g_hInstance weil die globalen Variablen aus unterschiedlichen Threads bze Prozessen aufgerufen werden Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.