EXE和DLL调用关系,DLL制作,钩子
作者:互联网
制作DLL时,在cpp种引入了头文件,但头文件里的全局变量在cpp种却不能用
参考大佬博客https://blog.csdn.net/speargod/article/details/88854344
制作DLL
DLL种包含 SetGlobalHook(设置钩子函数) UnsetGlobalHook(卸载钩子函数) GetMsgProc(钩子回调函数)
1、新建DLL空项目,我选的不到导出项的,导出项我们自己写,建好后是这样
2、右键源文件-》添加项-》添加cpp源文件
3、右键头文件-》添加项-》添加h头文件
4、在GH.cpp种写我们的函数实体
#include "GH.h" //这里包含了三个头文件,打开头文件菜单,把里面的都包含进去即可
#include "pch.h"
#include "framework.h"
LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam); //这三个不仅在头文件中需要写,在源文件中也需要写,这一定注意!!!
extern "C" __declspec(dllexport) BOOL SetGlobalHook(); //用作声明函数
extern "C" __declspec(dllexport) BOOL UnsetGlobalHook();
HHOOK g_hHook=NULL; //全局变量的定义,只能定义一次,可以声明多次,需要在头文件中声明
BOOL SetGlobalHook()
{
g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)GetMsgProc, GetModuleHandleA("GH"), 0);
if (NULL == g_hHook) {
return FALSE;
}
return TRUE;
}
LRESULT GetMsgProc(int code, WPARAM wParam, LPARAM lParam) {
return ::CallNextHookEx(g_hHook, code, wParam, lParam);
}
BOOL UnsetGlobalHook() {
if (g_hHook)
{
::UnhookWindowsHookEx(g_hHook);
}
return TRUE;
}
5、编写头文件GH.h
#include <Windows.h>
#pragma once //这一段用作创建共享数据段
#pragma data_seg("mydata")
extern HHOOK g_hHook; //把g_hHook声明在共享数据段中,注意声明与定义的区别,
#pragma data_seg() //声明不赋值,可多次;定义赋值,只能一次 前面加extern
#pragma comment(linker, "/SECTION:mydata,RWS")
extern "C" __declspec(dllexport) BOOL SetGlobalHook(); //这里跟源文件中的那段一样,这里用作导出函数
extern "C" __declspec(dllexport) BOOL UnsetGlobalHook();
LRESULT CALLBACK GetMsgProc(int code, WPARAM wParam, LPARAM lParam);
头文件中变量在源文件中不能使用?
参考上面注释:应在头文件声明,源文件中定义,声明用extern
生成DLL正常,但是使用dependency没有导出函数?
不仅需要在头文件中需要extern/LRESULT那三行,在源文件中也需要
6、编写exe调用DLL,
新建控制台应用程序,空的,GlobalHook.cpp
#include <iostream>
#include <Windows.h>
#pragma comment(lib, "GH.lib") //引入DLL生成的静态链接库
extern "C" __declspec(dllimport) BOOL SetGlobalHook(); //从DLL中导入我们要用的两个函数
extern "C" __declspec(dllimport) BOOL UnsetGlobalHook();
using namespace std; //命名空间
int main() {
if(SetGlobalHook())
cout << "SetGlobal OK" << endl;
else
cout << "SetGlobal ERROR" << endl;
system("pause");
if (UnsetGlobalHook())
cout << "UnsetGlobalHook OK" << endl;
else
cout << "UnsetGlobalHook ERROR" << endl;
system("pause");
}
7、生成项目,运行
生成时,需要把之前生成的dll和lib文件放到exe项目的目录里
然后再生成exe
再把dll放到debug目录下,和生成的exe同级,然后运行
标签:EXE,头文件,钩子,DLL,源文件,hHook,BOOL,extern 来源: https://www.cnblogs.com/kunspace/p/12165774.html