Написал программу, которая должна выполнять функцию антикейлогера(отлавливать хуки в системе через функцию в DLL). Но почему-то при подключении DLL к проекту программа не видит функцию в самой DLL. Как и что изменить, чтобы все увиделось и заработало? среда VS15. Коды прилагаю, может, я и там где ошибся.
Код в DLL:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "stdafx.h"
#pragma data_seg(".hdata") // секция в памяти общая для всех процессов
HINSTANCE hi = NULL; // эта переменная может изменяться любым поэтому здесь не должно быть ничего лишнего
#pragma data_seg() // конец секции
#pragma comment(linker, "/section:.hdata,rws") // даем права этой секции
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
EXPORT HHOOK SetKeyboardHook(void); // объявляем экспортируемую функцию
// а эти будут у всех свои
#include "Header.h"
HANDLE hFile = NULL; // !!!!! хэндл файла для каждого процесса должен быть свой !!!!!
HHOOK hKeyHook = NULL;
HHOOK hCBTHook = NULL;
BOOL APIENTRY DllMain(HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: // вызывается каждый раз когда новый процесс грузит DLL в свою память
{
if (!hi) // запоминаем запустивший хэндл(наша DLL) толко первый раз, чтобы он небыл переписан на новый
hi = hModule;
break;
}
case DLL_PROCESS_DETACH:
{
break;
}
default:
break;
}
return TRUE;
}
LRESULT CALLBACK DebugProc(int nCode, WPARAM wParam, LPARAM lParam) // вызывается при нажатии или отпускании клавиши
{
if (nCode)
return CallNextHookEx(hKeyHook, nCode, wParam, lParam);
if (lParam >= 0) // нам нужно только нажатие
printf("Замечен кейлогер");
return CallNextHookEx(hKeyHook, nCode, wParam, lParam); // обработали передаем дальше
}
HHOOK SetKeyboardHook(void) // эту функцию надо вызывать из приложения для создания ловушек
{
hKeyHook = SetWindowsHookEx(WH_DEBUG, &DebugProc, hi, 0);
return hKeyHook;
}
// конец DLL
Код основной программы, в которой вызывается DLL:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <locale>
#include <windows.h>
INT main() {
setlocale(LC_ALL, "russian");
HHOOK hook = SetKeyboardHook();
if (hook) {
while (WaitMessage())
{
MSG msg = { 0 };
while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
system("pause");
ExitProcess(0);
}
DLL подключаю через проект-свойства-...
Вероятно, этот код:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "stdafx.h"
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
EXPORT HHOOK SetKeyboardHook(void); // объявляем экспортируемую функцию
// а эти будут у всех свои
должен находиться в файле Header.h. Файл main.c должен подключить Header.h с помощью #include
. Кроме того, скорее всего имелось в виду следующее:
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllimport)
#endif
То есть в dll-модуле, который написан на C++, применяется атрибут dllexport
, а в main-модуле, который написан на C, применяется атрибут dllimport
(если всё наоборот, то следует написать #ifndef __cplusplus
). Проверьте всё это, и компилятор должен увидеть вашу функцию. Но этого недостаточно - её ещё должен увидеть линковщик, а это достигается ключами компоновки. Скорее всего, в Visual Studio нужно просто добавить в зависимости *.lib
-файл, который создался вместе с dll
.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Мне нужно произвести сортировку товаров по возрастанию ценыДелаю так:
Использую Spring BootЗадача довольно простая - в каждом методе у меня однотипные операции, проверка, вошел ли пользователь, если не вошел кидаем...
Подскажите, пожалуйста, как лучше всего добавить данные из JSON в ComboBoxГрафическая часть сделана с помощью Scene Builder, есть класс Controls, где прописаны...