SetWindowsHookEx friert Programm ein
-
Guten Morgen liebe Community
Nach einer langen Auszeit habe ich wieder angefangen C++ zu programmieren und bin nun auf mein erstes Problem gestoßen.Ich habe meine erste DLL erstellt und wollte direkt mit hooks anfangen,
habe dazu auch einen ziemlich guten Beispiel-Quellcode im Netz gefunden und ihn direkt versucht zu verstehen .Sobald ich eine Taste drücke friert mein Programm aber irgendwie ein..
Woran liegt das?Der Code der DLL ist nicht von mir, habe leider die URL nicht notiert :
#include <windows.h> #include <iostream> #include <stdio.h> #include <fstream> HINSTANCE hinst; HHOOK hhk; LRESULT CALLBACK wireKeyboardProc(int code, WPARAM wParam, LPARAM lParam) { std::ofstream myfile; myfile.open("example.txt"); myfile << "Ok\n"; CallNextHookEx(hhk, code, wParam, lParam); myfile.close(); return 0; } // install/uninstall Funktionen, hhk wird initalisiert! extern "C" __declspec(dllexport) void install() { hhk = SetWindowsHookEx(WH_KEYBOARD, wireKeyboardProc, hinst, NULL); } extern "C" __declspec(dllexport) void uninstall() { UnhookWindowsHookEx(hhk); } //Main Funktion -> hinst wird initalisiert! BOOL WINAPI DllMain(__in HINSTANCE hinstDLL, __in DWORD fdwReason, __in LPVOID lpvReserved ) { hinst = hinstDLL; return TRUE; }
und das Programm :
#include <iostream> #include <windows.h> #include <tchar.h> int _tmain(int argc, _TCHAR* argv[]){ HINSTANCE hinst = LoadLibrary(_T("Keyboard.dll")); if (hinst == NULL){ std::cout << "Can't load the library!"; } typedef void(*Install)(); typedef void(*Uninstall)(); Install install = (Install)GetProcAddress(hinst, "install"); Uninstall uninstall = (Uninstall)GetProcAddress(hinst, "uninstall"); install(); std::cout << "Installed sucessfully!"; std::getchar(); uninstall(); return 0; }
-
Du kannst ja mal mit dem Debugger gucken wo es sich aufhängt.
-
Es hängt sich bei der Eingabe also bei "std::getchar();" auf.
-
Fang erst mal mit Hello World an du Noob.
-
TheCppTim schrieb:
habe dazu auch einen ziemlich guten Beispiel-Quellcode im Netz gefunden
Woher weißt du das?
Setz einen Breakpoint in deinem Callback und schau, ob er reinkommt.
Eigentlich müsstest du das zurückgeben, was CallNextHookEx zurückgibt, aber das wird wahrscheinlich nicht das Problem sein.
-
Naja globale Hooks sind schon nicht ganz ohne. Da kann man leicht Deadlocks bauen.
Tip 1: Zerstöre alle lokalen CRT-Objekte bevor du
CallNextHookEx
aufrufst.
Tip 2: Verwende die CRT idealerweise gar nicht in der Hook-Procedure.