我正在嘗試創建一個系統範圍的掛鉤來監視進程並終止不需要的進程。
我搜索,發現我需要使用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