maddin Geschrieben 16. Juli 2003 Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SirLizium Geschrieben 17. Juli 2003 Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Diablo999 Geschrieben 17. Juli 2003 Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Diablo999 Geschrieben 17. Juli 2003 Teilen Geschrieben 17. Juli 2003 Noch was... Du solltest unbedingt UnhookBlaBla aufrufen, snsonsten musst neu booten um den Hook wegzubekommen... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
maddin Geschrieben 18. Juli 2003 Autor Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 18. Juli 2003 Teilen Geschrieben 18. Juli 2003 Was gibt ProcAdd zurück? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 18. Juli 2003 Teilen Geschrieben 18. Juli 2003 Ruf mal nach SetWindowsHookEx() GetLastError() auf und gib das aus. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
maddin Geschrieben 20. Juli 2003 Autor Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 21. Juli 2003 Teilen Geschrieben 21. Juli 2003 Laß mal in deiner DLLMain das switch weg und schreib nur g_hInstance = hInstance; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
maddin Geschrieben 21. Juli 2003 Autor Teilen Geschrieben 21. Juli 2003 Hat das Problem nicht gelöst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
idefix Geschrieben 22. Juli 2003 Teilen 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 Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
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.