2013-12-13 28 views
1

我正在嘗試創建一個系統範圍的掛鉤來監視進程並終止不需要的進程。
我搜索,發現我需要使用CBT鉤子,我第一次嘗試失敗,這是第二次,前面的問題可以找到Here雖然。
下面的代碼構建得很好,但它似乎甚至沒有調用鉤子!因爲我試圖在DllMain()設置斷點,但我從未到達那裏!其他功能似乎可以訪問!
這裏任何方式的代碼片段:
dllmain.cpp爲什麼系統無法正常工作?

// dllmain.cpp : Defines the entry point for the DLL application. 
#pragma once 
#include "stdafx.h" 
#include <iostream> 
#include <fstream> 
#include <Windows.h> 
using namespace std; 

HINSTANCE currentProcessHandle; 
HOOKPROC hkprcSysMsg; 
HHOOK hookID; 

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 
{ 
    std::ofstream outfile("test.txt"); 


    switch (ul_reason_for_call) 
    { 
    case DLL_PROCESS_ATTACH: 
     currentProcessHandle = hModule; 
     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) 
{ 
    std::ofstream outfile("test.txt"); 
    if (nCode >= 0) 
    { 
     switch (nCode) 
     { 
     case HCBT_CREATEWND: 
      outfile << L"Created!~"; 
      cout << "Created!~" << endl; 
      break; 
     case HCBT_DESTROYWND: 
      outfile << L"Destroied!~"; 
      cout << "Destroied!~" << endl; 
      break; 
     default: 
      cout << "sth else" << endl; 
      break; 
     } 
    } 
    else 
    { 
     return CallNextHookEx(hookID, nCode, wparam, lparam); 
    } 
    outfile.close(); 
} 

__declspec(dllexport) void InstallHook() 
{ 
    hookID = SetWindowsHookEx(WH_CBT, HookProcedure, currentProcessHandle, 0); 
} 

__declspec(dllexport) void UnistallHook() 
{ 
    UnhookWindowsHookEx(hookID); 
} 

這是
消費者應用

// Hook Executer.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include "..\Dll\dllmain.cpp" 
#include <iostream> 
using namespace std; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int num = -1; 
    cout << "1.Install Hook"<<endl 
     << "2.Unistall Hook"<<endl 
     << "0.Exit"; 
    do{ 
     cin >> num; 
     if (num ==1) 
     { 
      InstallHook(); 

     } 
     else 
     { 
      UnistallHook(); 
     } 
     getchar(); 
     system("cls"); 
     cout << "1.Install Hook" << endl 
      << "2.Unistall Hook" << endl 
      << "0.Exit"; 
    } while (num != 0 && num < 3); 


    return 0; 
} 

當我運行的程序沒有錯誤,甚至沒有anykind的例外,它就好像沒有DLL或我沒有編寫任何內部的DLL!它出什麼問題了 ?

+0

:-) include「.. \ Dll \ dllmain.cpp」不是正確的方法有一個DLL。你有一個Visual Studio解決方案2個項目,一個EXE和一個DLL? – manuell

+0

是的,我做!如果我不這樣做,我該怎麼打電話給DLL? – Breeze

+0

但您的EXE不會調用任何DLL!您只需將DLL cpp源文件包含在主EXE中... – manuell

回答

1

實現您的DLL的代碼在一個CPP文件,而不是一個標題:

//dllmain.cpp 
#include "stdafx.h" // include <Windows.h> 
        // and other std headers in stdafx.h, if not already done 

HINSTANCE currentProcessHandle; 
HHOOK hookID; 

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, 
         LPVOID lpReserved) { 

    if (ul_reason_for_call == DLL_PROCESS_ATTACH) 
     currentProcessHandle = hModule; 
    return TRUE; 
} 

LRESULT CALLBACK HookProcedure(int nCode, WPARAM wparam, LPARAM lparam) { 

    if (nCode < 0) return CallNextHookEx(NULL, nCode, wparam, lparam); 

    std::ofstream outfile; 
    outfile.open("test.txt",   // replace with an absolute path 
        std::fstream::app); // append mode 
    if (nCode >= 0) { 
     switch(nCode) { 
      case HCBT_CREATEWND: 
       outfile << "Created!\n"; 
       break; 
      case HCBT_DESTROYWND: 
       outfile << "Destroyed!\n"; 
       break; 
      default: 
       break; 
     } 
    } 
    outfile.close(); 
    return 0; 
} 

void InstallHook(void) { 
    hookID = SetWindowsHookEx(WH_CBT, HookProcedure, currentProcessHandle, 0); 
} 

void UninstallHook(void) { // NEW NAME 
    UnhookWindowsHookEx(hookID); 
}  

聲明DLL的API中的頭文件。

// dllapi.h 
void InstallHook(void); 
void UninstallHook(void); // NEW NAME 

用於導出DEF文件,將它添加到DLL項目

; Def file 
EXPORTS 
    InstallHook 
    UninstallHook 

在EXE項目,只包括DLL頭文件

#include "..\Dll\dllapi.h" 

在EXE項目,去properties->Linker->Input->Additional dependencies並添加生成DLL的過程中生成的lib文件。替代方案:使DLL成爲解決方案項目依賴項中EXE的依賴項,並在EXE屬性中設置爲:Linker->general->Use Library dependency Inputs

+0

感謝百萬編譯和構建就好,現在它創建的文本文件,但它的空!並沒有任何東西顯示在控制檯上(也許dll不支持控制檯窗口?)我還應該做些什麼才能使這個工作? – Breeze

+0

我改變它,以便它追加什麼創立,現在這是我的文本文件: 5A4F1B9C 5A4F1B9C 5A4F1BB4 5A4F1BB4 5A4F1BB4 5A4F1B9C 5A4F1B9C 5A4F1B9C 5A4F1B9C得到 非常感謝主席先生,我將挖掘更多,看看是什麼造成這一點。 明白了,我刪除了L,它的工作很好:)真棒:) – Breeze

+0

您是否使用文本文件的絕對路徑,如「c:\\ temp \\ test.txt」? – manuell

相關問題