Dll 可执行文件的编写与调用

news/2024/9/20 19:44:18/文章来源:https://www.cnblogs.com/lostin9772/p/18393266

一、Dll 可执行文件的编写

首先我们需要在 VS 创建一个动态链接库(DLL)项目,然后会生成如下代码:

// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "pch.h"BOOL APIENTRY DllMain( HMODULE hModule,  // 指向 Dll 模块的句柄DWORD  ul_reason_for_call,  // 指示调用 DllMain 的原因LPVOID lpReserved  // 保留参数,忽略)
{switch (ul_reason_for_call){// 进程加载本 Dll 后执行case DLL_PROCESS_ATTACH:MessageBoxA(NULL, "Dll 加载成功", NULL, NULL);break;// 线程被创建后执行case DLL_THREAD_ATTACH:break;// 线程正常退出后执行case DLL_THREAD_DETACH:break;// 进程卸载本 Dll 后执行case DLL_PROCESS_DETACH:break;}return TRUE;
}

直接编译即可生成一个最简单的 Dll 可执行文件,那么如果我们想要在 Dll 文件中导出相关函数,那么要怎么操作呢?

我们需要定义一个导出函数声明,并且对这个导出函数进行实现:

extern "C" __declspec(dllexport) void MsgBox(LPCSTR msg, LPCSTR title)
{MessageBoxA(NULL, msg, title, NULL);
}

上面的代码中,我们声明并实现了一个 MsgBox 函数,函数中调用了 MessageBoxA 函数。其中,__declspec(dllexport) 修饰符表示该函数用于导出,extern "C" 表示在对该函数进行编译的时候按照 C 语言编译方式进行。

其实除了导出函数外,我们还可以通过 __declspec(dllimport) 修饰符来告诉编译器,被它修饰的函数或变量需要从其他的 Dll 导入,由于 Dll 可执行文件很少用到导入功能,在此不做详述。

二、动态调用 Dll 可执行文件的导出函数

首先,我们需要定义一个函数指针用来接收这个导出函数:

// 定义一个函数指针
typedef void(*PMSGBOX)(LPCSTR msg, LPCSTR title);

然后我们通过 LoadLibrary 函数来动态加载 Dll 可执行文件,并通过 GetProcAddress 函数来从 Dll 可执行文件中获取特定的导出函数:

// 加载 Dll 模块
HMODULE hModule = LoadLibraryA("./console_Dll.dll");
if (hModule)
{PMSGBOX pMsgBox = (PMSGBOX)GetProcAddress(hModule, "MsgBox");pMsgBox("hello", "msgbox");
}

调用的结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/791157.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rabbitmq高可用集群搭建

需求分析基本情况 在进行RabbitMQ搭建时,我们基于现有的连接数据和业务需求进行了深入分析。目前的统计数据显示,连接数为631,队列数为80418。为了确保业务需求的顺利满足,我们需要在云产品和自建RabbitMQ消息队列服务之间做出选择。 经过比较发现,即使选择腾讯云的最高规…

谈谈springboot中@Conditional相关注解

@Conditional是一个元注解@ConditionalOnClass(xx.class) 这是用于修饰一个类的注解。它主要是让你的代码具有兼容性,如在多模块下common模块中有一些仅仅是部分其他模块依赖、需要配置的类(例如rabbitMQ配置类,我相信他不应该被全模块需要,但是他放在常用模块中依旧是最合…

Categraf+VictoriaMetrics+Grafana网络设备监控方案

背景 应公司网工邀请,一起研究架设一套系统,对公司网络设备进行监控和预警。 基础 什么是SNMP 简单网络管理协议SNMP(Simple Network Management Protocol)用于网络设备的管理。 网络设备多种多样,不同设备不同厂家管理接口各不相同,于是snmp应运而生,SNMP作为广泛应用于…

Categraf+VictoriaMetrics+Grafana,网络设备监控方案

背景 应公司网工邀请,一起研究架设一套系统,对公司网络设备进行监控和预警。 基础 什么是SNMP 简单网络管理协议SNMP(Simple Network Management Protocol)用于网络设备的管理。 网络设备多种多样,不同设备不同厂家管理接口各不相同,于是snmp应运而生,SNMP作为广泛应用于…

Kubernetes存储卷

1. 存储卷基础 1.1 存储卷基础 从概念上讲,存储卷是可供Pod中的所有容器访问的目录Pod规范中声明的存储卷来源决定了目录的创建方式、使用的存储介质以及目录的初始内容存储卷插件(存储驱动)决定了支持的后端存储介质或存储服务,例如hostPath插件使用宿主机文件系统,而nfs…

一场 Kafka CRC 异常引发的血案

一、问题概述 客户的生产环境突然在近期间歇式的收到了Kafka CRC的相关异常,异常内容如下 Record batch for partition skywalking-traces-0 at offset 292107075 is invalid, cause: Record is corrupt (stored crc = 1016021496, compute crc = 1981017560) 报错没有规律性,…

机器学习之——决策树信息增益计算[附加计算程序]

0 前言本文主要介绍信息增益的计算公式并举出若干例子帮助理解。 读者需要具备的知识有:信息熵、条件熵。 本文所示用的数据集为:游玩数据集 1.1节1 信息增益计算公式g(D,A)表示在条件A下对于目标变量D的信息增益。 H(D)表示随机变量D的信息熵。 H(D|A)表示在随机变量A条件下…

2024秋软件工程个人作业(第一次)

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13243这个作业的目标 熟悉aigc,帮助老师和助教了解我,为软工课程之后的开展做准备学号 102202135markdown编辑器1、个人logo文生图任…

ue渲染关闭运动模糊

网上提供的一种方法是在渲染设置中关闭动态模糊,但是测试渲染还是会发生模糊。参考另一种方法是在渲染设置中添加控制台变量,设置 r.motionblurquality = 0。该方法测试通过!

Windows下Bug管理系统MantisBT的安装和配置

因工作需要,最近在研究开源的bug管理系统,其中比较流行的是Redmine和MantisBT。Redmine我们在几年前有使用过,一开始感觉整个流程和UI很简洁,而且还可以支持一定的定制化,感觉不错。但随着使用的用户和项目多起来就不太好管理,给人的感觉很凌乱。所以就搭建了一个MantisB…

Windows下Bug管理系统MantisBT的部署

因工作需要,最近在研究开源的bug管理系统,其中比较流行的是Redmine和MantisBT。Redmine我们在几年前有使用过,一开始感觉整个流程和UI很简洁,而且还可以支持一定的定制化,感觉不错。但随着使用的用户和项目多起来就不太好管理,给人的感觉很凌乱。所以就搭建了一个MantisB…