Крючок Для Клавиатуры
автор Аркон
DLL-это косвенно исполняемый файл, который не имеет цикла сообщений для получения пользовательского ввода. Библиотеки DLL - это отдельные файлы, содержащие функции(не только), которые могут быть вызваны программами и другими библиотеками DLL. Для конечного пользователя DLL-это программа, которая не может быть выполнена непосредственно из программы Manger(или других оболочек), но с точки зрения системы есть два отличия между DLL и приложениями: DLL не могут иметь несколько запущенных экземпляров, загруженных в память. и библиотеки DLL присоединяются к процессам, только экземпляры приложений являются процессами. DLL расшифровывается как динамически подключаемая библиотека. Dynamic-Link-это механизм для связи библиотек с приложениями во время выполнения. Эти библиотеки (DLL) находятся в своих собственных исполняемых файлах(.dll) и не копируются в исполняемые файлы приложений(.exe), как и в случае со статическими ссылочными библиотеками. Важно понимать, что А.DLL загружается в адресное пространство указанного связующего приложения, а не в глобальную кучу! Преимущества использования метода динамического связывания заключаются в следующем:
Их можно обновить, не требуя перекомпиляции или повторной компоновки приложений.
Когда несколько приложений используют одно и то же .DLL, the .DLL просто загружается один раз для всех приложений(уменьшая объем памяти и дискового пространства).
Причина, по которой нам нужна DLL для общесистемного крючка, заключается в том, что мы хотим, чтобы функция фильтра находилась в любом адресном пространстве приложения. Поэтому, когда вы устанавливаете функцию фильтра сообщений крючка, которая лежит в .dll Windows maps the .dll автоматически попадает в адресное пространство всех приложений. Таким образом, вы получаете свою функцию фильтра, вызываемую для каждого процесса! Поэтому, когда мы динамично связываем крючок, который находится в а .DLL становится общесистемным крючком (конечно, это тоже зависит от типа функции фильтра). Ладно, теперь перейдем к важному теоретическому материалу..
Давайте начнем кодировать .DLL для общесистемного крючка клавиатуры, а затем я объясню, как динамическое связывание .DLL в наше приложение.
Пожалуйста, загрузите исходный код, чтобы увидеть, как все это написано и сделано.
// Это наш процесс обратного вызова клавиатуры:
// _declspec (dllexport) означает, что мы хотим позволить другим
// applications / DLL вызывают эту функцию, в тех же случаях, когда вы этого не делаете
// нужен этот префикс, но для безопасности мы будем использовать его.
_declspec(dllexport) LRESULT обратный вызов KBHookProc(int код,
WPARAM wParam, LPARAM lParam)
{
// Если код меньше 0, мы вызываем следующий Хук,
// вот как работают крючки, ничего особенного
if (Code < 0) return (CallNextHookEx(hhook, Code, wParam, lParam));
// Информация о том, что происходит с клавиатурой
если (lParam & (1 << 31)) // бит 31 показывает, не работает ли ключ
// Вызовите следующий крюк.
return (CallNextHookEx(hhook, Code, wParam, lParam));
}
// Это то же самое, что WinMain/Main, но для библиотек DLL,
// вы получаете экземпляр DLL, причина того, как ваш .DLL называется зарезервированной.
BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason,
LPVOID lpReserved)
{
// На самом деле есть 4 причины, мы обработаем только 2 из них,
/- потому что этого достаточно для нашей проги.
if (dwReason == DLL_PROCESS_ATTACH) / / загрузка файла.DLL
{
если (pcount = = 0)
{
// Init / / время первой загрузки
// Установить крючок..
}
pcount++;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
// UnInit до того, как система освободит его .DLL из памяти.
если (pcount == 1)
{
// Бесплатно
// Убить крюка..
}
pcount--;
}
возврат (1);
}
Видите ли, это довольно легко, я бы сказал. В любом случае, pcount-это наш счетчик процессов, он говорит, сколько раз .DLL была вызвана. pcount-это специальная переменная, она должна быть в глобальной куче, потому что если ее не будет, то каждый раз наша .DLL называется он будет инициализирован до 0 снова и снова again...so чтобы предотвратить это, мы говорим компилятору поместить переменную в глобальную кучу. Мы делаем это и для ручки крючка, потому что мы устанавливаем крючок только один раз. Если мы будем ставить крючок каждый раз, то ... DLL называется, это будет испорченный крюк, и он не будет работать должным образом и так, как мы хотим! Чтобы сообщить компилятору, что мы хотим, чтобы он поместил переменную в глобальную кучу, мы делаем это:
#pragma data_seg ("SharedBlock")
HHOOK hhook = NULL;
int pcount = 0;
#pragma data_seg()
Обратите внимание, что каждая переменная должна быть инициализирована. хорошо, мы собираемся HHOOK hhook = NULL; unsigned long keystrokes = 0; int pcount = 0; #pragma data_seg () мы скоро закончим писать.DLL, каждый .DLL-файл должен иметь .DEF-файл для управления компилятором. В.Файл DEF мы сообщаем компилятору функции, которые мы хотим экспортировать, да, те, которые имеют _declspec (dllexport), и мы сообщаем компилятору об общем блоке данных. (См. исходный код для полного понимания.DEF file). Как-то так.DLL-файл готов, вы должны скопировать его в приложение, которое загружает его .Каталог DLL или скопировать его в %windir%\system.
Ладно ,вот и все.DLL вещи, теперь давайте загрузим .DLL мы только что создали! Сначала мы должны объявить указатели на функции с параметрами, которые они получают.
typedef void (*LPFunction)(void);
Функция LPFunction = NULL;
// Это указатель на функцию, которая не имеет
// parameters и который возвращает пустоту.
HMODULE DLLmodule = LoadLibrary ("mydll.dll");
если (!DLLmodule) //.DLL файл не найден!
// Эта функция получает код конкретной разыскиваемой функции из памяти,
// Обратите внимание на заглавные буквы, искомое имя функции должно быть точно,
// как в самом деле .Деф файл И.CPP-файл библиотеки DLL, которую мы написали.
function = (LPFucntion)GetProcAddress(DLLmodule, "функция");
если (!функция) / / код реализации функции не найден!
// Теперь вы можете вызвать функцию.
функция ();
// После завершения использования .DLL, не забудьте освободить его!
FreeLibrary(DLLmodule);
У-у-у, вот оно что!! Ну, это были только основы, и это не сработает, если вы скопируете пасту.
Дата публикации: