Почему SetWindowsHookEx не принимает процедуру подключения?

Я пытаюсь создать 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 ‘для создания указателя на член

выполнение, как предложено выше, также не решает проблему!

Что мне здесь не хватает?

1

Решение

Ваша подключаемая процедура должна быть свободной функцией или методом статического класса. Если вы хотите вызвать метод экземпляра класса, вам нужно обернуть этот вызов одним из перечисленных выше.

Редактировать:

Чтобы установить крючок, вам не нужны классы. Это основной пример. Любая другая проблема связана с вашим использованием класса. Если вы хотите использовать класс, убедитесь, что вы знаете, как это сделать. Если вы не уверены, 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);
}
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]