У меня есть один файл решения в Visual Studio, и у меня есть в нем два проекта, один для файла .dll и один другой проект для файла .c:
это файл .h:
#include <windows.h>
#ifndef BHANNAN_TEST_CLASS_H_
#define BHANNAN_TEST_CLASS_H_
extern int __declspec (dllexport) Factorial(int n);
#endif
и в .c файле (из dll):
#include "hanan.h"
#include <stdio.h>
int Factorial(int n) {
printf("in DLL %d \n" ,n);
return 0;
}
Теперь у меня есть загрузчик / тестер, который я пытаюсь из него загрузить dll, чтобы перехватывать нажатия клавиш в блокноте, просто чтобы понять механизм перехвата.
это код загрузчика:
#include <windows.h>
#include <stdio.h>
typedef int (*functor) (int);
functor funcptr =NULL;
int main () {
HWND windowHandle;
HINSTANCE hMod;
HOOKPROC lpfn;
DWORD threadId;
HHOOK hook;
HMODULE myDLL = LoadLibraryW(L"dll123.dll");
funcptr = (functor) GetProcAddress(myDLL,"Factorial");
/// printing issues:////////////////
printf("%d \n\r" , myDLL);
printf("%d" , funcptr(33));
//////////////////////////////////////
lpfn = (HOOKPROC) funcptr;
hMod = myDLL;
windowHandle = FindWindow(L"Notepad",NULL);
threadId = GetWindowThreadProcessId(windowHandle, NULL);
hook = SetWindowsHookEx(WH_KEYBOARD,lpfn,hMod,threadId);//(WH_CBT, HookCBTProc, hInst, threadId);
/// printing issues:
printf("%d %d %d %d\n" , hook, WH_KEYBOARD , lpfn , hMod);
printf("%d %d \n",threadId , windowHandle );
getchar();
return 0;
}
Я получаю всю печать без нулей, что означает, что нет нулей (при условии, что блокнот работает), но когда я нажимаю клавишу в блокноте, я сразу получаю исключение,
с использованием Visual Studio 2010 и Windows 7
добавлены свойства исключения:
Exception Offset: 0006632c
Exception Code: c0000409
Exception Data: 00000000