其他分享
首页 > 其他分享> > EXE和DLL调用关系,DLL制作,钩子

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