Ĺadny brzuch
Mam funkcję
SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hinstDLL, 0);
ale przy kompilacji wywala mi błąd
Cannot convert 'long (__stdcall *)(int,unsigned int,long)' to 'int (__stdcall *)()'
Błąd dotyczy 4 argumentu funkcji czyli 0, tylko nie rozumiem czemu skoro nawet w MSDN-ie w przykładzie stoi tam 0 ? :/
Kompilator C++ Builder 6.
A NULL/NIL próbowałeś?
tak, nic nie daje ... ten sam błąd :/
Coś mam dziwne wrażenie, że trochę niedoczytałeś. Jesteś pewien że chodzi o ostatni parametr?
Cannot convert 'long (__stdcall *)(int,unsigned int,long)' to 'int (__stdcall *)()'
Mi to bardziej wygląda na błąd typu parametrów funkcji przekazywanej do hooka (KeyboardProc). Pokaż deklarację KeyboardProc.
Użytkownik Ali240 edytował ten post 27 grudzień 2007, 11:50
tak, tak ... zasugerowałem się tym że kompilator podświetlił mi linijkę z 4 argumentem (w programie mam każdy argument w nowej lini) teraz zrzutowałem rezultat funkcji KeyboardProc na typ HOOKPROC i jest dobrze.
SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hinstDLL, 0);
BTW ... możliwe jest żeby przez wywołanie SetWindowsHookEx (z powyższymi parametrami) w ciele głównej funkcji pliku dll powodowało przechwytywanie wszystkich komunikatów (chodzi mi o WM_CREATE) ponieważ po skompilowaniu tego kodu:
//plik glowny programu #include <windows.h> HINSTANCE hinstDLL; static TCHAR app[] = TEXT( "Hooks for Windows" ); LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CREATE: hinstDLL = LoadLibrary((LPCTSTR) "dll.dll"); break; case WM_DESTROY: FreeLibrary(hinstDLL); PostQuitMessage(0); break; case WM_KEYDOWN: break; default: return (DefWindowProc(hWnd, uMsg, wParam, lParam)); } return(0L); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //tworzenie okna i te sprawy }
//plik dll BOOL WINAPI DllMain(HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { static HINSTANCE hinstDLL = hModule; static HOOKPROC hkprcKeyb; switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: MessageBox(NULL, "Ładowanie biblioteki", "Info", MB_OK); hhookKeyb = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, hinstDLL, 0); if(!hhookKeyb) MessageBox(NULL, "Ustawienie HOOK'a NIE powiodło się", "Info", MB_OK | MB_IConerror); else MessageBox(NULL, "Ustawienie HOOK'a powiodło się", "Info", MB_OK); break; case DLL_PROCESS_DETACH: MessageBox(NULL, "Wyładowywanie biblioteki ;)", "Info", MB_OK); if(!UnhookWindowsHookEx(hhookKeyb)) MessageBox(NULL, "Usunięcie HOOK'a NIE powiodło się", "Info", MB_OK | MB_IConerror); else MessageBox(NULL, "Usunięcie HOOK'a powiodło się", "Info", MB_OK); break; } return TRUE; } //keyboard hook functions LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { //jakies tam funkcje return CallNextHookEx(hhookKeyb, nCode, wParam, lParam); }
ciągle (np. przy uruchomieniu notatnika), w trakcie działania mojego porgramu, wyskakuje mi MessageBox że biblioteka została załadowana (a po zamknięciu notatnika że biblioteka została wyładowana). Nie rozumiem czemu, a dopiero się uczę więc jeśli ktoś byłby na tyle uprzejmi to prosiłbym o wyjaśnienie dlaczego tak się dzieje.
Prawdę mówiąc nie do końca znam winapi, więc ciężko mi powiedzieć co jest nie tak, ale spróbuj zrzucić wartości parametrów funkcji okienkowej i sprawdź co się dzieje z uchwytem przekazywanym do tej funkcji (na co wskazuje).
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hinstDLL, 0);
ale przy kompilacji wywala mi błąd
Cannot convert 'long (__stdcall *)(int,unsigned int,long)' to 'int (__stdcall *)()'
Błąd dotyczy 4 argumentu funkcji czyli 0, tylko nie rozumiem czemu skoro nawet w MSDN-ie w przykładzie stoi tam 0 ? :/
Kompilator C++ Builder 6.
A NULL/NIL próbowałeś?
tak, nic nie daje ... ten sam błąd :/
Coś mam dziwne wrażenie, że trochę niedoczytałeś. Jesteś pewien że chodzi o ostatni parametr?
Cannot convert 'long (__stdcall *)(int,unsigned int,long)' to 'int (__stdcall *)()'
Mi to bardziej wygląda na błąd typu parametrów funkcji przekazywanej do hooka (KeyboardProc). Pokaż deklarację KeyboardProc.
Użytkownik Ali240 edytował ten post 27 grudzień 2007, 11:50
tak, tak ... zasugerowałem się tym że kompilator podświetlił mi linijkę z 4 argumentem (w programie mam każdy argument w nowej lini) teraz zrzutowałem rezultat funkcji KeyboardProc na typ HOOKPROC i jest dobrze.
SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, hinstDLL, 0);
BTW ... możliwe jest żeby przez wywołanie SetWindowsHookEx (z powyższymi parametrami) w ciele głównej funkcji pliku dll powodowało przechwytywanie wszystkich komunikatów (chodzi mi o WM_CREATE) ponieważ po skompilowaniu tego kodu:
//plik glowny programu #include <windows.h> HINSTANCE hinstDLL; static TCHAR app[] = TEXT( "Hooks for Windows" ); LRESULT CALLBACK MainWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CREATE: hinstDLL = LoadLibrary((LPCTSTR) "dll.dll"); break; case WM_DESTROY: FreeLibrary(hinstDLL); PostQuitMessage(0); break; case WM_KEYDOWN: break; default: return (DefWindowProc(hWnd, uMsg, wParam, lParam)); } return(0L); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { //tworzenie okna i te sprawy }
//plik dll BOOL WINAPI DllMain(HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { static HINSTANCE hinstDLL = hModule; static HOOKPROC hkprcKeyb; switch(ul_reason_for_call) { case DLL_PROCESS_ATTACH: MessageBox(NULL, "Ładowanie biblioteki", "Info", MB_OK); hhookKeyb = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, hinstDLL, 0); if(!hhookKeyb) MessageBox(NULL, "Ustawienie HOOK'a NIE powiodło się", "Info", MB_OK | MB_IConerror); else MessageBox(NULL, "Ustawienie HOOK'a powiodło się", "Info", MB_OK); break; case DLL_PROCESS_DETACH: MessageBox(NULL, "Wyładowywanie biblioteki ;)", "Info", MB_OK); if(!UnhookWindowsHookEx(hhookKeyb)) MessageBox(NULL, "Usunięcie HOOK'a NIE powiodło się", "Info", MB_OK | MB_IConerror); else MessageBox(NULL, "Usunięcie HOOK'a powiodło się", "Info", MB_OK); break; } return TRUE; } //keyboard hook functions LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { //jakies tam funkcje return CallNextHookEx(hhookKeyb, nCode, wParam, lParam); }
ciągle (np. przy uruchomieniu notatnika), w trakcie działania mojego porgramu, wyskakuje mi MessageBox że biblioteka została załadowana (a po zamknięciu notatnika że biblioteka została wyładowana). Nie rozumiem czemu, a dopiero się uczę więc jeśli ktoś byłby na tyle uprzejmi to prosiłbym o wyjaśnienie dlaczego tak się dzieje.
Prawdę mówiąc nie do końca znam winapi, więc ciężko mi powiedzieć co jest nie tak, ale spróbuj zrzucić wartości parametrów funkcji okienkowej i sprawdź co się dzieje z uchwytem przekazywanym do tej funkcji (na co wskazuje).