【发布时间】:2013-12-13 15:38:54
【问题描述】:
我正在尝试创建一个系统范围的挂钩来监视进程并终止不需要的进程。我搜索并发现我需要使用 CBT 钩子,我的第一次尝试失败,这是第二次,前一个问题可以是 found here。
以下代码构建得很好,但似乎甚至没有调用挂钩,因为我尝试在DllMain() 中设置断点,但我从未到达那里。不过其他功能似乎可以访问!
这里是sn-ps的代码:
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;
}
当我运行程序时,没有任何错误,甚至没有任何异常,就好像没有 DLL 或者我在该 DLL 中没有编写任何代码。它有什么问题?
【问题讨论】:
-
:-) include "..\Dll\dllmain.cpp" 不是拥有 DLL 的正确方法。您是否有包含 2 个项目、一个 EXE 和一个 DLL 的 Visual Studio 解决方案?
-
是的,我愿意!如果我不这样做,我应该如何调用 dll?
-
但是您的 EXE 不调用任何 DLL!您刚刚在主 EXE 中包含了 DLL cpp 源...
-
第一步:禁止包含“..\Dll\dllmain.cpp”行!并将其替换为 include "..\Dll\dllmain.h" 在标题中,使用 __declspec(dllimport) 声明 InstallHook 和 UnistallHook
-
看,你似乎不知道用 DLL 进行 C 编程的基础知识,你将很难尝试使用 CBT Hooks。您链接的 pastebin 在标题中显示了 DllMain 实现...如果我稍后有时间,我可能会发布一个答案。
标签: c++ windows visual-c++ hook