Veröffentlicht 16. Juli 200322 j 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?
17. Juli 200322 j 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...
17. Juli 200322 j 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
17. Juli 200322 j Noch was... Du solltest unbedingt UnhookBlaBla aufrufen, snsonsten musst neu booten um den Hook wegzubekommen...
18. Juli 200322 j 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.
20. Juli 200322 j 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?
22. Juli 200322 j 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
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.