Функция из dll не проэкспортировалась, имя нужно из obj файла вытаскивать.
Пример:
Код:
#include <windows.h>
#include <stdio.h>
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "gdi32.lib")
#ifdef __cplusplus
extern "C" {
#endif
FILE *f;
DWORD coord;
__declspec(dllexport) void f1() { printf("f()\n"); }
__declspec(dllexport) LRESULT CALLBACK KeyboardProc (int code, WPARAM wParam, LPARAM lParam) { POINT pnt; GetCursorPos(&pnt); switch(wParam) { case VK_HOME: coord = pnt.y; coord <<= 16; coord |= pnt.x; SendMessage(GetActiveWindow(), WM_LBUTTONDBLCLK, MK_LBUTTON, coord); break; case VK_END: coord = pnt.y; coord <<= 16; coord |= pnt.x; SendMessage(GetActiveWindow(), WM_RBUTTONDBLCLK, MK_RBUTTON, coord); break; case VK_LEFT: pnt.x -=5; break; case VK_RIGHT: pnt.x +=5; break; case VK_UP: pnt.y -= 5; break; case VK_DOWN: pnt.y +=5;break; } SetCursorPos(pnt.x, pnt.y);return CallNextHookEx(0, code, wParam, lParam);}
#ifdef __cplusplus
}
#endif
Код:
#include <windows.h>
#include <d3dx9.h>
#include <stdio.h>
#include <tchar.h>
#include <stdlib.h>
#pragma comment(lib, "user32.lib")
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "gdi32.lib")
typedef void (__cdecl* KPROC)();
KPROC tt;WNDCLASSEX wc; MSG msg; HWND hwnd;HOOKPROC hkp;HOOKPROC hkp2;HOOKPROC hkp3;HINSTANCE hinstdll;HHOOK hhook;HHOOK hhook2;HHOOK hhook3;HOOKPROC KeyboardProc;HOOKPROC GetMsgProc;HOOKPROC SysMsgProc;HWND ghwnd;WORD coord;
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ static POINT pnt;switch (uMsg){
case WM_LBUTTONDBLCLK: printf("lb\n"); break;
case WM_RBUTTONDBLCLK: printf("rb\n"); break;
case WM_CREATE:ghwnd = hwnd;break;case WM_KEYDOWN:GetCursorPos(&pnt);switch(wParam){case VK_HOME: coord = pnt.x; coord <<= 8; coord |= pnt.y; SendMessage(ghwnd, WM_LBUTTONDBLCLK, MK_LBUTTON, coord); break; case VK_END: coord = pnt.x; coord <<= 8; coord |= pnt.y; SendMessage(ghwnd, WM_RBUTTONDBLCLK, MK_RBUTTON, coord);break;case VK_LEFT:pnt.x -=5;break;case VK_RIGHT:pnt.x +=5;break;case VK_UP: pnt.y -= 5;break;case VK_DOWN:pnt.y +=5;break;}SetCursorPos(pnt.x, pnt.y);return 0;case WM_DESTROY:PostQuitMessage(NULL);return 0;case WM_PAINT:return 0;default: return DefWindowProc(hwnd, uMsg,wParam, lParam);} return DefWindowProc(hwnd, uMsg,wParam, lParam);}
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR CmdLine, int CmdShow) { wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW|CS_VREDRAW; wc.lpfnWndProc = (WNDPROC) WndProc; wc.cbClsExtra = NULL; wc.cbWndExtra = NULL; wc.hInstance = hInst; wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); wc.lpszMenuName = NULL; wc.lpszClassName = "SimpleWinClass"; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hIconSm =LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); RegisterClassEx(&wc); hwnd = CreateWindowEx(NULL, "SimpleWinClass", "W2", WS_OVERLAPPEDWINDOW, 0, 0, 0, 0, NULL, NULL, hInst, NULL); ShowWindow(hwnd, SW_SHOWNORMAL); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam;}
int main(int argc, char* argv[]) { HINSTANCE hInstance = GetModuleHandle(0); LPSTR CommandLine = GetCommandLine();
// Получение хэндла к DLL осуществляется функцией LoadLibrary с аргументом в виде имени DLL// хэндл к DLL
hinstdll = LoadLibrary(TEXT("hookdll.dll")); if (hinstdll == 0) printf("hinstdll\n"), exit(0);
tt = (KPROC)GetProcAddress(hinstdll, "f1"); if (tt == 0) printf("tt = 0: %x\n", GetLastError());
else tt();
// GetProcAddress используется для получения адресов функций в модуле DLL// получение адресов функций в DLL
hkp = (HOOKPROC)GetProcAddress(hinstdll, "_KeyboardProc@12"); if (hkp == 0) printf("hkp = 0: %x\n", GetLastError());
//hkp2 = (HOOKPROC)GetProcAddress(hinstdll, "_GetMsgProc@12"); if (hkp2 == 0) printf("hkp2 = 0: %x\n", GetLastError());
//hkp3 = (HOOKPROC)GetProcAddress(hinstdll, "_f2@12"); if (hkp3 == 0) printf("hkp3 = 0: %x\n", GetLastError());
// Функция SetWindowsHookEx инсталлирует процедуру захвата и специфицирует тип процедуры захвата,// определяет должна ли эта процедура захвата ассоциироваться со всеми потоками на том же десктопе// или с отдельноым потоком и указатель на входную точку в процедуру// ГЛОБАЛЬНЫЙ ХУК помещается в DLL отдельно от приложения использующего хук.// Приложение, инсталлирующее хук, должно иметь хэндл к модулю DLL, чтобы использовать процедуру захвата// SetWindowsHookEx// первый аргумент: тип инсталлируемой процедуры захвата// WH_KEYBOARD мониторит сообщения клавиатуре// второй аргумент: указатель на процедуру захвата // третий аргумент: хэндл dll содержащей второй аргумент// четвертый аргумент: определяет индентификатор потока, с которым ассоциирована процедура захвата. // если этот параметр ноль, то процедура захвата ассоциирована со всеми потоками на десктопе// NTVDM
hhook = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC) hkp, hinstdll, 0); if (hhook == 0) printf("hhook = 0: %x\n", GetLastError());
//hhook2 = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC) hkp2, hinstdll, 0); if (hhook2 == 0) printf("hhook2= 0: %x\n", GetLastError());
//hhook3 = SetWindowsHookEx(WH_SYSMSGFILTER, hkp3, hinstdll, 0); if (hhook3 == 0) printf("hhook3= 0: %x\n", GetLastError());
//else
//printf("%x\n");
HRESULT hresult = WinMain(hInstance, NULL,CommandLine, SW_SHOWDEFAULT);
UnhookWindowsHookEx(hhook);
//UnhookWindowsHookEx(hhook2);
//UnhookWindowsHookEx(hhook3);
return 0;}
|