EXE和DLL调用关系,DLL制作,钩子

制作DLL时,在cpp种引入了头文件,但头文件里的全局变量在cpp种却不能用
 
 
制作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同级,然后运行
 

猜你喜欢

转载自www.cnblogs.com/kunspace/p/12165774.html
今日推荐