Hi!
I know we've had dozens of discussions on Win32 hooks, but I couldn't get any of them to work for me simply because I couldn't compile the file that references the DLL.
In the following case, I got an:
error LNK2019: unresolved external symbol "__declspec(dllimport) int __stdcall InstallHook (struct HINSTANCE __ *)" (__imp_?InstallHook@@YGHP
For now, here's what I came up with after copy-pasting from a few sources:
the one thats supposed to compile to .EXE:
The one that compiles to DLL:Code:#include <windows.h> #include <stdio.h> #include <stdlib.h> extern __declspec (dllimport) LRESULT CALLBACK KbProc(int, WPARAM, LPARAM); extern __declspec (dllimport) BOOL WINAPI InstallHook(HMODULE ahmod); extern __declspec (dllimport) void WINAPI RemoveHook(void); int main(int argc, char *argv[]) { HMODULE hmod = LoadLibrary("Hooky.dll"); InstallHook(hmod); system("pause"); return 0; };
Finally, the module definition file:Code:#include <windows.h> #include <stdio.h> #include <stdlib.h> __declspec (dllexport) LRESULT CALLBACK KbProc(int, WPARAM, LPARAM); __declspec (dllexport) BOOL WINAPI InstallHook(HMODULE ahmod); __declspec (dllexport) void WINAPI RemoveHook(void); #pragma data_seg("shared_data") // Superglobals HHOOK hookdata = 0; #pragma data_seg() #pragma comment(linker, "/SECTION:shared_data,S") HMODULE hmodule = 0; HWND hwindow = 0; BOOL recycle = FALSE; BOOL running = FALSE; UINT timerid = 0; void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime); __declspec (dllexport) LRESULT CALLBACK KbProc(int code, WPARAM w, LPARAM l) { if ( code < 0 || code != HC_ACTION ) return CallNextHookEx(hookdata,code,w,l); char buff[100]; sprintf(buff,"Values are: %d %u %u\n", code, w, l); MessageBox(0, buff, "ok", 0); switch(w) { case NULL: break; default: return CallNextHookEx(hookdata,code,w,l); } return TRUE; } __declspec (dllexport) BOOL APIENTRY DllMain (HMODULE hmod, DWORD reason, LPVOID na) { switch (reason) { case DLL_PROCESS_ATTACH: hmodule = hmod; break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } /* Returns TRUE on success, FALSE on failure */ return TRUE; } __declspec (dllexport) BOOL WINAPI InstallHook(HMODULE ahmod) { if ( hookdata != 0 ) return FALSE; hookdata = SetWindowsHookEx(WH_KEYBOARD, KbProc, (HINSTANCE) ahmod, 0); if ( !hookdata ) MessageBox(0, TEXT("Hook failed."), TEXT("Error"), MB_ICONEXCLAMATION); return hookdata != 0; } __declspec (dllexport) void WINAPI RemoveHook(void) { if ( hookdata != 0 ) { UnhookWindowsHookEx(hookdata); } } void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) { }
Code:LIBRARY Hooky EXPORTS KbProc InstallHook RemoveHook



LinkBack URL
About LinkBacks


