制作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同级,然后运行
 

EXE和DLL调用关系,DLL制作,钩子的更多相关文章

  1. 外壳exe通过反射调用dll时

    外壳exe通过反射调用dll时,dll是 4.0的框架,外壳exe也需要编译成4.0的框架,如果dll本身有调用32位的dll,那么外壳exe也需要编译成32位. 调试时报的那个错,直接继续运行,不影 ...

  2. c#调用c++dll(c++界面在c#显示)____制作dll

    1.c++dll含界面,以摄像头dll为例: 1.直接在c++SDK上调试运行成功,生成dll. 2.留一个调用接口(格式如下,写在cpp文件中,即函数体): extern "C" ...

  3. ASP.net/C#中如何调用动态链接库DLL

    动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件夹,你会发现文件夹中有很多DLL文 ...

  4. delphi dll调用问题

    dll传递string实现方法 delphi中dll传递string的实现方法: dll项目uses第一个引用sharemem单元; 调用的项目uses第一个引用sharemem单元; 调用的单元us ...

  5. 【JNI】OPUS压缩与解压的JNI调用(.DLL版本)

    OPUS压缩与解压的JNI调用(.DLL版本) 一.写在开头: 理论上讲,这是我在博客园的第一篇原创的博客,之前也一直想找个地方写点东西,把最近做的一些东西归纳总结下,但是一般工程做完了一高兴就把东西 ...

  6. c#调用c++ dll(一)

    首先来说说c++中的dll 核心的一些知识 比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作.可能存在一些模块的功能较为通用,在构造其它软件系统时 ...

  7. 利用OllyDebug查看程序调用的dll模块

    最近在做一个Qt项目,在产品发布的时候一直为找不到程序到底缺少了哪些dll组件而困扰.具体问题是,在我的项目中使用到了QMediaPlayer播放一段音频文件,我使用的开发环境的Win7 32位,而在 ...

  8. C# 调用外部dll(转)

    C# 调用外部dll   一.      DLL与应用程序 动态链接库(也称为DLL,即为"Dynamic Link Library"的缩写)是Microsoft Windows最 ...

  9. C#调用外部DLL介绍及使用详解

    一.      DLL与应用程序 动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件 ...

随机推荐

  1. phpstudy一直使用php5.6版本一直“”“报错应用程序无法正常启动0xc000007b”,亲测可行

    http://www.php.cn/xiazai/gongju/1351 vc9和vc11-vc14运行库 2018-01-26 来源/作者:php中文网 «» 下载次数:7808 工具简介: php ...

  2. 通过Ajax提交form表单来提交上传文件

    Ajax 提交form方式可以将form表单序列化 然后将数据通过data提交至后台,例如: $.ajax({      url : "http://localhost:8080/" ...

  3. php中 instanceof有什么作用

    php中 instanceof有什么作用 作用:(1)判断一个对象是否是某个类的实例,(2)判断一个对象是否实现了某个接口.

  4. HDU 1114 完全背包问题

    题意:有一个存钱罐,空罐时的重量是e,满罐时的重量是f,现在有n种硬币,每一种有无限个,现在给出每一种硬币的价值p和重量w,问存钱罐中最少钱,输出最小钱,否则输出... 思路:变形的完全背包问题,只是 ...

  5. 【Learning Notes】线性链条件随机场(CRF)原理及实现

    1. 概述条件随机场(Conditional Random Field, CRF)是概率图模型(Probabilistic Graphical Model)与区分性分类( Discriminative ...

  6. set_time_limit(0)是什么意思?

    语法 : void set_time_limit (int seconds) 说明 : 设定一个程式所允许执行的秒数,如果到达限制的时间,程式将会传回错误.它预设的限制时间是30秒,max_execu ...

  7. HTTP协议---三次握手

    HTTP协议 关于协议 ​ 对于应用层开发人员,接触最多的网络协议通常都是传输层的TCP,为什么这么说,因为再往上的应用层协议,如:HTTP.HTTPS.POP3.SMTP.RPC.FTP.TELNE ...

  8. Python--day27--内置函数isinstance和issubclass方法

  9. H3C PPP会话流程

  10. 怎么让FOXMAIL关了以后在右下角自动收取邮件

    1.缩小到任务栏:打开foxmail,在工具-系统设置-常规,选项中有一项最小化时在任务栏显示,勾选上即可.2.要自动收取邮件,选中邮件账户,右键打开菜单,属性-接收邮件,右边勾选上“每隔*分钟自动收 ...