制作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. Win7如何显示文件后缀

    有些时候,我们需要修改文件的后缀名,但是Windows7系统默认不显示文件后缀.我们怎样显示和修改文件后缀呢?请接着往下看. 工具/原料   一个win7系统 方法/步骤   1 如图所示,此时是无法 ...

  2. Levenshtein distance 编辑距离算法

    这几天再看 virtrual-dom,关于两个列表的对比,讲到了 Levenshtein distance 距离,周末抽空做一下总结. Levenshtein Distance 介绍 在信息理论和计算 ...

  3. Fragment学习(二): 管理Fragment和Fragment通讯

    一. 管理Fragment 首先,如果你想在Android3.0及以下版本使用Fragment,你必须引用android-support-v4.jar这个包 然后你写的activity不能再继承自Ac ...

  4. centos7的gnome假死

    centos7的gnome假死,干掉gnome相关进程,如nautilus,kworker

  5. 后缀数组 + LCP加速多模式匹配算法 O(m+logn)

    #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...

  6. electron-vue 窗口拖拽及自定义边框,及关闭缩小放大化方法

    1.窗口的最小化按钮和关闭按钮以及标题栏自定义,不使用 electron 自身携带的原生标题栏 在src文件夹下main下index.js文件添加 mainWindow = new BrowserWi ...

  7. P1066 汪老师玩卡片

    题目描述 汪老师得到了一些卡片,这些卡片上标有数字0或5.现在他可以选择其中一些卡片排成一列,使得排出的一列数字组成的数最大,且满足被90整除这个条件.同时这个数不能含有前导0,即0不能作为这串数的首 ...

  8. Junit 测试集(打包测试)实例

    测试集,直译过来的意思就是把测试集合起来,再详细一些就是把多个单元测试集合起来 .单元测试可以理解为:单个接口 或者单个类/方法 的测试 项目背景:测试基于spring开发的项目代码 实例模板:pac ...

  9. Java中的断言assert的用法

    Java陷阱之assert关键字 一.概述 在C和C++语言中都有assert关键,表示断言. 在Java中,同样也有assert关键字,表示断言,用法和含义都差不多. 二.语法 在Java中,ass ...

  10. ASP.NET Core 开启后台任务

    本文告诉大家如何通过 Microsoft.Extensions.Hosting.BackgroundService 开启后台任务 实现 BackManagerService 类继承 Backgroun ...