制作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. phpstorm 中背景色的调整

  2. 箭头函数表达式和声名式函数表达式的区别以及 Function.prototype的bind, apply,call方法

    箭头函数不能用做构造函数 箭头函数没有arguments参数 箭头函数没有自己的this,是从作用域链上取this,是与箭头函数定义的位置有关的,与执行时谁调用无关,所以用call,apply,bin ...

  3. HTTP协议详解以及URL具体访问过程(转载)

    https://blog.csdn.net/f45056231p/article/details/82533490

  4. Taglib自定义万能标签扩展 DownLoad

    http://www.thinkphp.cn/extend/538.html 用ThinkPHP的标签做网站觉得不够快速,就自己写了一个扩展,感觉挺好的,分享出来,给有需要的TPER. 复制代码 &l ...

  5. jar包运行

    配置mainClass:            <plugin>                <groupId>org.apache.maven.plugins</gr ...

  6. nano使用说明

    Main nano help text The nano editor is designed to emulate 仿真.模拟 the functionality and ease-of-use o ...

  7. 2019-9-2-win10-uwp-车表盘-径向规

    title author date CreateTime categories win10 uwp 车表盘 径向规 lindexi 2019-09-02 12:57:38 +0800 2018-2-1 ...

  8. H3C 配置NAT Server

  9. Python--day40--threading模块的几个方法

    import time import threading #threading.get_ident() 查看当前进程号 def wahaha(n): time.sleep(0.5) print(n,t ...

  10. WPF 从零开始开发 dotnet Remoting 程序

    本文告诉大家如何不使用框架,从零开始开发一个 dotnet remoting 程序 在我的另一篇博客 WPF 使用RPC调用其他进程 就大概告诉了大家如何在 WPF 使用 dotnet remotin ...