2013-12-13 49 views
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」創建一個指向成員

做用如上述犯規建議要麼解決問題!

我在這裏失蹤了什麼?

回答

5

您的掛鉤程序必須是自由函數或靜態類方法。如果你想調用一個類實例方法,你需要將這個調用包裝在上面的一箇中。

編輯:

要設置一個鉤子,你不需要類。這是一個基本的例子。每一個其他問題都源於你使用一個班級。如果你想使用一門課,確保你知道如何去做。如果你不確定,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); 
} 
+0

你的意思是我應該聲明所有的人都爲靜態?在這種情況下,我做了現在我得到的鏈接器錯誤,如!: ################################## ################## 錯誤LNK2001:無法解析的外部符號「private:static struct HINSTANCE__ * CBT :: CBTHook :: currentProcessHandle」(?currentProcessHandle @ CBTHook @ CBT @@ 0PAUHINSTANCE__ @@一個) ############################################## ###### 1> CBTHook.obj:錯誤LNK2001:無法解析的外部符號「private:static struct HH​​OOK__ * CBT :: CBTHook :: hookID」(?hookID @ CBTHook @ CBT @@ 0PAUHHOOK __ @@ A) – Breeze

+0

需要不是類方法,或者靜態類方法是您傳遞給SetWindowsHookEx的函數。其他一切都是你的決定。如果您遇到錯誤,請發佈更新的代碼。 – nvoigt

+0

我不創建一個類,因此方法,我應該如何創建一個DLL並使用它?我遵循這裏的指示:http://msdn.microsoft.com/en-us/library/ms235636.aspx當我嘗試從我的課堂獲得該功能,我不知道還有其他地方放??! – Breeze