2013-12-13 30 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

相关问题