我正在尝试创建一个系统范围的挂钩来监视进程并终止不需要的进程。
我搜索,发现我需要使用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!它出什么问题了 ?
:-) include“.. \ Dll \ dllmain.cpp”不是正确的方法有一个DLL。你有一个Visual Studio解决方案2个项目,一个EXE和一个DLL? – manuell
是的,我做!如果我不这样做,我该怎么打电话给DLL? – Breeze
但您的EXE不会调用任何DLL!您只需将DLL cpp源文件包含在主EXE中... – manuell