当前位置: 首页 > news >正文

.net core 调用c dll_用C++生成一个简单的DLL文件VS2008

大家好,我是孤帆冒雨行,最近刚入职到一家软件公司从事C++开发工作,在学校学习的编程内容到了工作中是远远不够用的,所以开始了自学之路,但由于我不是计算机科班出身的,所以这条路任重而道远。大家看到我的教程是一步步的来,从如何创建一个项目开始,请大家不要吃惊。

从接触简单的项目开始学起吧,先使用C++创建一个简单的DLL,到后面可以用C++进行调用,因为后面的工作中也需要调用别的公司的DLL。

138c520b77eee111a39c2ccf71cfb71d.png

一、动态链接库(DLL)简介

动态链接库英文为DLL,是Dynamic Link Library的缩写。DLL是一个包含可由多个程序,同时使用的代码和数据的库。在Windows中,这种文件被称为应用程序拓展。例如,在 Windows 操作系统中,Comdlg32.dll 执行与对话框有关的常见函数。因此,每个程序都可以使用该 DLL 中包含的功能来实现“打开”对话框。这有助于避免代码重用和促进内存的有效使用。 通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。例如,一个记账程序可以按模块来销售。可以在运行时将各个模块加载到主程序中(如果安装了相应模块)。因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。[1]

二、DLL生成的两种方式

在C++中,dll的生成主要有两种方法:一是使用__declspec(dllexport) 创建dll,二是使用模块定义(.def)文件创建dll。

方法1: 使用 __declspec(dllexport) 来创建dll

__declspec是Microsoft VC中专用的关键字,它配合着一些属性可以对标准C/C++进行扩充。__declspec关键字应该出现在声明的前面。

__declspec(dllexport)用于Windows中的动态库中,声明导出函数、类、对象等供外面调用,省略给出.def文件。即将函数、类等声明为导出函数,供其它程序调用,作为动态库的对外接口函数、类等。

1.创建一个MyDLL项目

首先我们选择创建项目,项目类型选择Visual C++ -> Win32,模板选择Win32项目,在合适的位置创建一个名为MyDLL的项目,单击确定并在弹出的向导中点击下一步。

53d4029b07242b1bbcc4eff72d3ec84d.png

创建一个Win32项目

应用程序类型选择DLL,附加选项选中空项目,单击完成。

8621dc95f37deb607d3ed53b24289dc0.png

类型选择DLL,附加选项选中空项目

在解决方案资源管理器中的源文件上单击右键选择添加->新建项,创建一个名为MyDLL的.cpp文件。

7be77c432c573b545d37bc6e3b804ba3.png

添加->新建项

fdea5a09ba6340b34114e84c2932b15d.png

新建名为MyDLL的.cpp文件

再以同样的方法在头文件上单击右键添加->新建项,创建一个名为MyDLL的.h文件。

94ee16c4e4bc4c66d0635e3967c97526.png

新建名为MydDLL的.h文件

2.添加代码到文件中

复制或输入以下代码到MyDLL.cpp文件中。

//MyDLL.cpp#define DLL_EXPORT#include "MyDLL.h"int add(int a, int b){    return a + b;}int substract(int a, int b){    return a - b ;}

复制或输入以下代码到MyDLL.h文件中

//MyDLL.h#ifdef DLL_EXPORT //如果在工程里已经添加预定义宏      #define MYDLL_EXPORT extern "C" __declspec(dllexport) //那DLLEXPORT就指代__declspec(dllexport) 用于dll的导出#else  //当工程中不包含DLL_EXPORTS预定义时      #define MYDLL_EXPORT extern "C" __declspec(dllimport) //DLLEXPORT 就指代__declspec(dllimport)#endif//extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码MYDLL_EXPORT int add(int a, int b);MYDLL_EXPORT int sub(int a, int b);

3.生成解决方案

在解决方案资源管理器中的解决方案"MyDLL"上单击右键,选择生成解决方案,或者在编写完代码后直接按F7生成解决方案。

bf71eef82181cbbcfb24a95794db6835.png

生成解决方案

4.找到生成的dll文件

接下来就可以在你创建的项目文件夹下的Debug文件夹中找到你生成的MyDLL.dll文件,以及静态库文件MyDLL.lib文件了。

4d02327d06d21094b859483784bc661d.png

找到dll文件

我们使用Depends软件来查看我们刚刚生成的dll文件,在Depends软件中打开我们刚刚生成的dll文件,或者拖动到软件中,我们就可以看到其中我们编写的add和sub功能了。

7af9ad46bb0dc4d4b5db6260d8e0edce.png

查看dll文件

注:Depends软件下载及使用方法请自行百度。

方法2: 使用模块定义(.def)文件创建dll

.def文件(模块定义文件)是包含一个或多个描述各种DLL属性的Module语句的文本文件。.def文件或__declspec(dllexport)都是将公共符号导入到应用程序或从DLL导出函数。如果不提供__declspec(dllexport)导出DLL函数,则DLL需要提供.def文件。

1.创建一个MyDLL项目

与刚才的方法一样创建一个MyDLL项目,但不同的是,我们不用再创建一个MyDLL.h的头文件,而是在源文件中创建一个.def的模块定义文件。具体操作为,在解决方案资源管理器中的源文件上单击右键,选择添加->新建项,新建一个名为MyDLL的.def文件。

80deacab18a556cffce23233deca22c8.png

创建名为MyDLL的.def文件

2.添加代码到文件中

复制或输入以下代码到MyDLL.cpp文件中。

//MyDLL.cppint add(int a, int b){    return a + b;}int sub(int a, int b){    return a - b ;}

复制或输入以下代码到MyDLL.def文件中。

LIBRARY "MyDLL"EXPORTSadd @2sub @1

其中LIBRARY语句用于指定动态链接库的名称,EXPORTS指明需要导出的函数,其中@加数字为导出函数的顺序,顺序可自行修改,也可以不加@数字,则导出的为默认顺序。

3.生成解决方案

以上述同样的方法生成解决方案,这里不再赘述。

4.查看生成的dll文件

在同样的位置找到刚刚生成的dll文件,并使用Depends软件来查看,这回生成的函数中我们可以注意到,函数的顺序号改变了,sub为1,add为2,与我们刚刚在.def模块定义文件中定义的一样。

edb8a0ddfb5666bbcc7f624c1191f3a4.png

查看dll文件


以上就是使用VS2008 C++生成DLL动态库的两种方法,如果有内容写的不全或者不好的地方,请大家指正,或者大家有什么问题也欢迎留言讨论。

对于DLL调用的方式,我们下期再讲,感兴趣的同学可以先自行尝试。

参考资料:

[1]百度百科——.dll

https://baike.baidu.com/item/.dll/2133451?fr=aladdin#2

[2]extern “C”的作用详解

https://www.cnblogs.com/xiangtingshen/p/10980055.html

[3]__declspec(dllexport)与__declspec(dllimport)

https://blog.csdn.net/huangyimo/article/details/81748939

相关文章:

  • microbit编程_Micro:bit少儿编程入门第一课
  • mysql数据迁移到sqlserver_数据库网关-实现西门子PLC与MySQL/SQLServer数据库双向通讯...
  • ping32终端安全管理系统_通过Ping32实现对终端的远程协助
  • gazebo入门_Gazebo仿真控制中,有哪些你不知道的秘密?
  • bigsur降级回catalina_手贱升 macOS Big Sur 后,该如何降级?
  • eclipse如何连接mysql_idea、PyCharm连接MySQL错误如何解决?
  • component是什么接口_Spring Bean是什么
  • wpf textbox垂直对齐方式_果冻公开课第九课:打破传统布局方式的flex(上)
  • 4路组相连cache设计_写了多年代码,你却不知道的程序设计的5个底层逻辑
  • python爬取网页文本_python2、python3 伪装浏览器爬取网页内容的简单示例
  • idea html代码提示_Java后端精选基础教程:使用开发工具 IDEA「连载 4」
  • 各路由协议的协议号_离婚协议范本!
  • python按行拆分表格_Python对Excel按列值筛选并拆分表格到多个文件的代码
  • easyui datagrid重新加载detailview异常_tomcat类加载机制了解一下
  • 关于python格式对齐的问题_python格式对齐
  • 【comparator, comparable】小总结
  • Angular4 模板式表单用法以及验证
  • Cumulo 的 ClojureScript 模块已经成型
  • docker容器内的网络抓包
  • es的写入过程
  • Java多线程(4):使用线程池执行定时任务
  • js如何打印object对象
  • LintCode 31. partitionArray 数组划分
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • PAT A1120
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • QQ浏览器x5内核的兼容性问题
  • SAP云平台里Global Account和Sub Account的关系
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 番外篇1:在Windows环境下安装JDK
  • 高性能JavaScript阅读简记(三)
  • 构造函数(constructor)与原型链(prototype)关系
  • 关于springcloud Gateway中的限流
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 老板让我十分钟上手nx-admin
  • linux 淘宝开源监控工具tsar
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ###STL(标准模板库)
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (多级缓存)缓存同步
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (规划)24届春招和25届暑假实习路线准备规划
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (三分钟)速览传统边缘检测算子
  • (数位dp) 算法竞赛入门到进阶 书本题集
  • (一)SpringBoot3---尚硅谷总结
  • (转)大型网站架构演变和知识体系
  • (转载)从 Java 代码到 Java 堆
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .Net环境下的缓存技术介绍