C++之创建与使用dll

目录

1、创建dll

test.h

test.cpp

Source.def

2、使用dll

testdll.cpp


DLL,全称“Dynamic Link Library”,中文名为“动态链接库”,是一种在Windows操作系统中常见的库文件格式。它包含了可以由多个程序同时使用的代码和数据。与静态链接库(Static Link Library,.lib文件)不同,动态链接库在程序运行时才被加载到内存中,因此可以节省内存空间,并允许程序在不重新编译的情况下更新库文件。

DLL文件通常包含以下类型的函数和数据:

导出函数:这些函数可以由其他程序调用。它们被编译并包含在DLL中,以便其他程序可以通过动态链接来调用它们。

资源:DLL可以包含图标、位图、字符串等资源,这些资源可以被其他程序使用。

数据:DLL也可以包含共享数据,这些数据可以在多个程序之间共享。

使用DLL的好处包括:

资源共享:多个应用程序可以同时使用同一个DLL中的函数和数据,从而节省磁盘和内存空间。

模块化:DLL允许将代码划分为独立的模块,这使得代码更易于管理和维护。

插件化:应用程序可以使用DLL作为插件来扩展其功能,而无需修改应用程序本身。

版本控制:通过更新DLL文件,可以在不重新编译整个应用程序的情况下更新程序的功能。

然而,使用DLL也需要注意一些问题,如DLL的依赖管理、版本冲突以及安全性等。

1、创建dll

创建mydll工程,移除默认文件,添加以下文件

test.h

#ifdef MYDLL_EXPORTS#define MATH_API __declspec(dllexport)#else#define MATH_API __declspec(dllimport)#endifMATH_API int Add(int a, int b);MATH_API int Sub(int a, int b);

test.cpp

#include "test.h"int Add(int a, int b) {  return a + b;}int Sub(int a, int b) {  return a - b;}

Source.def

LIBRARYEXPORTSAddSub

编译后生成mydll.lib和mydll.dll文件

2、使用dll

创建控制台项目,添加以下文件

testdll.cpp

#include <iostream>
#include "windows.h"
​
typedef int (*lpAddFun)(int, int);//宏定义函数指针类型
typedef int (*lpSubFun)(int, int);//宏定义函数指针类型
​
int main()
{std::cout << "Hello World!\n";HINSTANCE hDll;//DLL 句柄lpAddFun addFun;//函数指针lpSubFun subFun;//函数指针hDll = LoadLibrary(L"mydll.dll");//动态获取dll文件的路径if (hDll != nullptr){addFun = (lpAddFun)GetProcAddress(hDll, "Add");//根据函数名在dll文件中获取该函数的地址  subFun = (lpSubFun)GetProcAddress(hDll, "Sub");if (addFun != nullptr){int result = addFun(2, 3);int result2 = subFun(10, 6);printf("2+3=%d\n", result);printf("10-6=%d", result2);}
​FreeLibrary(hDll);}return 0;
}
​

将mydll.lib和mydll.dll文件拷贝到exe文件所在目录下

Hello World!

2+3=5

10-6=4

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

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

相关文章

09 函数和存储过程

文章目录 函数和存储过程函数创建存储过程创建存储过程和存储函数操作函数和存储过程区别 函数和存储过程 存储过程和函数是事先经过编译并存储在数据库中的一段sql语句集合&#xff0c;调用存储过程和函数可以简化应用开发工作&#xff0c;提高数据处理的效率。 函数创建 d…

人工智能|机器学习——k-近邻算法(KNN分类算法)

1.简介 k-最近邻算法&#xff0c;也称为 kNN 或 k-NN&#xff0c;是一种非参数、有监督的学习分类器&#xff0c;它使用邻近度对单个数据点的分组进行分类或预测。虽然它可以用于回归问题&#xff0c;但它通常用作分类算法&#xff0c;假设可以在彼此附近找到相似点。 对于分类…

五个与iOS基础开发相关的案例:

iOS是由苹果公司开发的移动操作系统&#xff0c;专为iPhone、iPad和iPod touch等设备设计。iOS系统以其流畅的用户体验、丰富的功能和强大的安全性而著称&#xff0c;成为全球最受欢迎的移动操作系统之一。iOS基础开发则是构建在这些设备上的应用程序的过程&#xff0c;涉及多个…

JavaScript—— 运算符总结(超全)

JavaScript—— 运算符总结(超全) 1.小括号运算符 ​ ()在我们js执行代码的过程中&#xff0c;一行代码内&#xff0c;优先执行小括号里面的内容; 2. 自增和自减运算符&#xff08;一元运算符&#xff09; 自增&#xff1a;让当前变量1的意思 let num 2 num // 3 num // …

Linux shell 列举当前所有网卡的IPV4地址及网卡名。

命令一&#xff1a; ip -4 addr show | grep inet | awk { printf "%s ", $2; for (i5; i<NF; i) { printf "%s ", $i }; printf "\n" } | awk {print $1, $NF} 命令二&#xff1a; 忽略 lo 环路网卡 ip -4 addr show | grep inet | awk …

标志寄存器

文章目录 标志寄存器是什么ZF标志PF标志SF标志CF标志OF标志adc指令sbb指令cmp指令有条件的转移指令DF标志和串传送指令pushf和popf 标志寄存器是什么 在8086CPU中标志寄存器是一个特殊的寄存器&#xff0c;具有以下3中功能&#xff1a; 1.用来存储相关指令的某些执行结果 2.用…

.SVN 信息泄露漏洞原理以及修复方法

漏洞名称&#xff1a;.SVN信息泄露、版本管理工具文件信息泄漏 漏洞描述&#xff1a;据介绍&#xff0c;SVN&#xff08;subversion&#xff09;是程序员常用的源代码版本管理软件。一旦网站出现SVN 漏洞&#xff0c;其危害远比SQL注入等其它常见网站漏洞更为致命&#xff0c;…

餐饮行业新风口:社区店的成功案例与经营秘诀

在竞争激烈的餐饮行业中&#xff0c;社区店正成为一个新的风口。作为一名90后的鲜奶吧创业者&#xff0c;我在社区开店已经5年时间&#xff0c;下面我将分享一些成功的社区店案例&#xff0c;并揭示其经营秘诀。 1、案例一&#xff1a;特色小吃店 这家小吃店以地方特色美食为…

MySQL安装与卸载

安装 1). 双击官方下来的安装包文件 2). 根据安装提示进行安装(全部默认就可以) 安装MySQL的相关组件&#xff0c;这个过程可能需要耗时几分钟&#xff0c;耐心等待。 输入MySQL中root用户的密码,一定记得记住该密码 配置 安装好MySQL之后&#xff0c;还需要配置环境变量&am…

平台总线--ID匹配和设备树匹配

一、ID匹配之框架代码 id匹配&#xff08;可想象成八字匹配&#xff09;&#xff1a;一个驱动可以对应多个设备 ------优先级次低 注意事项&#xff1a; device模块中&#xff0c;id的name成员必须与struct platform_device中的name成员内容一致&#xff0c;因此device模块中…

数据结构与算法-插值查找

引言 在计算机科学的广阔天地中&#xff0c;数据结构和算法扮演着至关重要的角色。它们优化了信息处理的方式&#xff0c;使得我们在面对海量数据时能够高效、准确地进行检索与分析。本文将聚焦于一种基于有序数组且利用元素分布规律的查找算法——插值查找&#xff08;Interpo…

C++面向对象程序设计-北京大学-郭炜【课程笔记(五)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;五&#xff09;】 1、常量对象、常量成员函数1.1、常量对象1.2、常量成员函数1.3、常引用 2、友元&#xff08;friends&#xff09;2.1、友元函数2.2、友元类 3、运算符重载的基本概念3.1、运算符重载 4、赋值运算符的重…

二维码门楼牌管理系统应用场景:推动旅游与文化产业的智慧化升级

文章目录 前言一、二维码门楼牌管理系统在旅游领域的应用二、二维码门楼牌管理系统在文化产业的应用三、结语 前言 随着信息技术的不断发展&#xff0c;二维码门楼牌管理系统作为一种创新的信息化手段&#xff0c;正在逐渐渗透到旅游和文化领域。它通过为文化景点、旅游景点和…

ARM系统控制和管理接口System Control and Management Interface

本文档描述了一个可扩展的独立于操作系统的软件接口,用于执行各种系统控制和管理任务,包括电源和性能管理。 本文档描述了系统控制和管理接口(SCMI),它是一组操作系统无关的软件接口,用于系统管理。SCMI 是可扩展的,目前提供了以下接口: • 支持的接口的发现和自描述…

Java Map接口实现类之 HashMap

定义 public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable{static final int DEFAULT_INITIAL_CAPACITY 1 << 4; //默认初始化容积&#xff0c;就是默认数组的长度为 16static final int MAXIMUM_CAP…

keep-alive 页面切换不触发onActivated和onDeactivated方法周期

<keep-alive :include"tagList"><component :is"Component" /></keep-alive>const tagList computed(() > {return $store.state.tagList })原因&#xff1a; store.state.app.tagList返回的是一个 Proxy&#xff0c; 代理了数组&am…

openxml获取xlsx的Excel.Validation

在 Open XML SDK 中&#xff0c;无法直接使用 Excel.Range 和 Excel.Validation&#xff0c;因为这是 VSTO (Visual Studio Tools for Office) 的概念&#xff0c;而不是 Open XML SDK 的概念。Open XML SDK 提供了对 Office Open XML (OOXML) 文件格式的低级访问&#xff0c;而…

Docker上部署LPG(loki+promtail+grafana)踩坑复盘

Docker上部署LPG&#xff08;lokipromtailgrafana&#xff09;踩坑复盘 声明网上配置部署踩坑 声明 参考掘金文章&#xff1a;https://juejin.cn/post/7008424451704356872 版本高的用docker compose命令&#xff0c;版本低的用docker-compose 按照文章描述&#xff0c;主要准备…

Windows下PostgreSQL安装教程

一、下载 https://www.enterprisedb.com/downloads/postgres-postgresql-downloads

自动化测试框架有哪些?

前言 自动化测试常用的Python框架有哪些&#xff1f;常用的框架有Robot Framework、Pytest、UnitTest/PyUnit、Behave、Lettuce。Pytest、Robot Framework和UnitTest主要用于功能与单元测试&#xff0c;Lettuce和Behave仅适用于行为驱动测试。 一、Robot Framework Python测…