制作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. Project Euler Problem 14-Longest Collatz sequence

    记忆化搜索来一发.没想到中间会爆int #include <bits/stdc++.h> using namespace std; const int MAXN = 1000000; in ...

  2. 如何查看redis内存使用情况

    https://jingyan.baidu.com/article/2c8c281dbd079f0008252a0f.html Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以 ...

  3. [转]什么是CNN、RNN、LSTM

    . 全连层 每个神经元输入: 每个神经元输出: (通过一个激活函数) 2. RNN(Recurrent Neural Network) 与传统的神经网络不通,RNN与时间有关. 3. LSTM(Lon ...

  4. Linux 内核kobject 缺省属性

    当被创建时, 每个 kobject 被给定一套缺省属性. 这些属性通过 kobj_type 结构来指定. 这个结构, 记住, 看来如此: struct kobj_type { void (*relea ...

  5. windows编译caffe2遇到的问题

    首先介绍下window编译caffe2整体流程: 说明:如果不需要python支持只需3.4即可,而且编译亦不会出现问题. 1. 安装python2.7,. 我使用的是anaconda python2 ...

  6. 如何用python“优雅的”调用有道翻译?

    前言 其实在以前就盯上有道翻译了的,但是由于时间问题一直没有研究(我的骚操作还在后面,记得关注),本文主要讲解如何用python调用有道翻译,讲解这个爬虫与有道翻译的js“斗争”的过程! 当然,本文仅 ...

  7. 转 java面试题及答案(基础题122道,代码题19道)

    JAVA相关基础知识1.面向对象的特征有哪些方面 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时 ...

  8. Channel 9视频整理【2】

    JadeChang https://channel9.msdn.com/Niners/JadeChang 繁体中文视频 2016 Nano Server / Docker / Containers 打 ...

  9. K:缓存数据库双写数据一致性方案

    对于缓存和数据库双写,其存在着数据一致性的问题.对于数据一致性要求较高的业务场景,我们通常会选择使用分布式事务(2pc.paxos等)来保证缓存与数据库之间的数据强一致性,但分布式事务的复杂性与对资源 ...

  10. [梁山好汉说IT] 区块链在梁山的应用

    [梁山好汉说IT] 区块链在梁山的应用 0x00 摘要 区块链属于一种去中心分布式数据存储系统,有其擅长的应用场景,也有其缺点. 下面用梁山为例来阐释下区块链部分概念&应用. 0x01 梁山好 ...