1
我試圖創建一個DLL,我可以用它來監控所有系統事件(進程創建,銷燬等) 這就是我想出迄今:爲什麼SetWindowsHookEx不接受鉤子程序?
DLL的主要 - 入口點我的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;
};
}
CB THook.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」創建一個指向成員
做用如上述犯規建議要麼解決問題!
我在這裏失蹤了什麼?
你的意思是我應該聲明所有的人都爲靜態?在這種情況下,我做了現在我得到的鏈接器錯誤,如!: ################################## ################## 錯誤LNK2001:無法解析的外部符號「private:static struct HINSTANCE__ * CBT :: CBTHook :: currentProcessHandle」(?currentProcessHandle @ CBTHook @ CBT @@ 0PAUHINSTANCE__ @@一個) ############################################## ###### 1> CBTHook.obj:錯誤LNK2001:無法解析的外部符號「private:static struct HHOOK__ * CBT :: CBTHook :: hookID」(?hookID @ CBTHook @ CBT @@ 0PAUHHOOK __ @@ A) – Breeze
需要不是類方法,或者靜態類方法是您傳遞給SetWindowsHookEx的函數。其他一切都是你的決定。如果您遇到錯誤,請發佈更新的代碼。 – nvoigt
我不創建一個類,因此方法,我應該如何創建一個DLL並使用它?我遵循這裏的指示:http://msdn.microsoft.com/en-us/library/ms235636.aspx當我嘗試從我的課堂獲得該功能,我不知道還有其他地方放??! – Breeze