Я пытаюсь создать DLL, где я могу использовать для мониторинга всех системных событий (создание процессов, уничтожение и т. Д.)
Это то, что я дошел до сих пор:
Длл основной— Точка входа моей длл
// dllmain.cpp : Defines the entry point for the DLL application.
#include "stdafx.h"#include "CBTHook.h"BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
CBT::CBTHook::SetHandle(hModule);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Заголовочный файл DLL
//Dll header file - function signatures
#ifdef CBTHOOKDLL_EXPORTS
#define CBTHOOKDLL_API __declspec(dllexport)
#else
#define CBTHOOKDLL_API __declspec(dllimport)
#endif
namespace CBT
{
class CBTHook
{
public:
CBTHook();
static void SetHandle(HINSTANCE handle);
void InstallHook();
void UnistallHook();
LRESULT CALLBACK HookProcedure(int nCode, WPARAM wparam, LPARAM lparam);
~CBTHook();
private:
static HINSTANCE currentProcessHandle;
HOOKPROC hkprcSysMsg;
static HHOOK hookID;
};
}
CBTHook.cpp
// CBTHook.cpp : Defines the exported functions for the DLL application.
//
#pragma once
#include "stdafx.h"#include "CBTHook.h"#include <Windows.h>
#include <iostream>
using namespace std;
namespace CBT
{
CBTHook::CBTHook()
{
}
void CBTHook::SetHandle(HINSTANCE handle)
{
currentProcessHandle = handle;
}
void CBTHook::InstallHook()
{
hookID = SetWindowsHookEx(WH_CBT,HookProcedure, currentProcessHandle, 0);
}
void CBTHook::UnistallHook()
{
UnhookWindowsHookEx(hookID);
}
LRESULT CALLBACK CBTHook::HookProcedure(int nCode, WPARAM wparam, LPARAM lparam)
{
if (nCode >= 0)
{
switch (nCode)
{
case HCBT_CREATEWND:
cout << "Created!~" << endl;
break;
case HCBT_DESTROYWND:
cout << "Destroied!~" << endl;
break;
default:
cout << "sth else" << endl;
break;
}
}
else
return CallNextHookEx(hookID, nCode, wparam, lparam);
}
}
Теперь проблема в том, что SetWindowsHookEx
не приму HookProcedure
в то время, как я прочитал и увидел в сети, возвращаемое значение рассматриваемой функции является правильным.
Я получаю ошибку:
ошибка C3867: «CBT :: CBTHook :: HookProcedure»: вызов функции отсутствует в списке аргументов; использовать&CBT :: CBTHook :: HookProcedure ‘для создания указателя на член
выполнение, как предложено выше, также не решает проблему!
Что мне здесь не хватает?
Ваша подключаемая процедура должна быть свободной функцией или методом статического класса. Если вы хотите вызвать метод экземпляра класса, вам нужно обернуть этот вызов одним из перечисленных выше.
Редактировать:
Чтобы установить крючок, вам не нужны классы. Это основной пример. Любая другая проблема связана с вашим использованием класса. Если вы хотите использовать класс, убедитесь, что вы знаете, как это сделать. Если вы не уверены, C ++ не является Java. Ты не необходимость использовать класс, если он работает просто отлично без.
Пример:
#include "stdafx.h"
HHOOK hHook;
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
hHook = SetWindowsHookEx(WH_CBT, HookProcedure, hModule, 0);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
LRESULT CALLBACK HookProcedure(int nCode, WPARAM wparam, LPARAM lparam)
{
if (nCode >= 0)
{
switch (nCode)
{
case HCBT_CREATEWND:
cout << "Created!~" << endl;
break;
case HCBT_DESTROYWND:
cout << "Destroied!~" << endl;
break;
default:
cout << "sth else" << endl;
break;
}
}
else
return CallNextHookEx(hHook, nCode, wparam, lparam);
}
Других решений пока нет …