2013-12-13 6 views
1

나는 내가이 내가 지금까지 올라와있다 무엇 시스템 이벤트의 모든 (프로세스 생성, 파괴, 등) 를 모니터링하는 데 사용할 수있는 DLL을 만들려고하고 있어요 내 DLL의왜 SetWindowsHookEx가 후크 프로 시저를 수락하지 않습니까? 진입 점 -</p> <p><strong>의 DLL 주요</strong>을 :

// 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 파일

// 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); 
    } 
} 

THook.cpp 이제 문제는 내가 읽고 문제의 함수의 반환 값이 올바른지 인터넷에서 본대로 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 : 해결되지 않은 외부 기호 "개인 : 정적 구조체 HINSTANCE__ * CBT :: CBTHook :: currentProcessHandle"(? currentprocesshandle @ CBTHook @ CBT @@PAUHINSTANCE__ @@) ########################### ###### 1> CBTHook.obj : 오류 LNK2001 : 해결되지 않은 외부 기호 "private : 정적 구조체 HHOOK__ * CBT :: CBTHook :: hookID"(? hookID @ CBTHook @ CBT @@ 0PAUHHOOK __ @@ A) – Breeze

+0

클래스 메서드가 아니거나 정적 클래스 메서드가 될 필요가 SetWindowsHookEx에 전달하는 함수입니다. 다른 모든 것은 당신의 결정입니다. 오류가 발생하면 업데이트 된 코드를 게시하십시오. – nvoigt

+0

나는 클래스를 만들지 않으므로 메서드를 어떻게 작성해야 DLL을 만들고 사용할 수 있습니까? 나는 여기 지시를 따른다 : http : //msdn.microsoft.com/en-us/library/ms235636.aspx 그리고 내가 나의 클래스에서 그 기능을 얻으려고 할 때, 나는 어디에 놓을 지 모른다? !! – Breeze