当前位置: 首页 > 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格式对齐
  • [译]CSS 居中(Center)方法大合集
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Apache Zeppelin在Apache Trafodion上的可视化
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • in typeof instanceof ===这些运算符有什么作用
  • JDK9: 集成 Jshell 和 Maven 项目.
  • LeetCode算法系列_0891_子序列宽度之和
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Spring Boot MyBatis配置多种数据库
  • ubuntu 下nginx安装 并支持https协议
  • Vue小说阅读器(仿追书神器)
  • Web标准制定过程
  • 从PHP迁移至Golang - 基础篇
  • 协程
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 硬币翻转问题,区间操作
  • # include “ “ 和 # include < >两者的区别
  • #1015 : KMP算法
  • #Lua:Lua调用C++生成的DLL库
  • #Ubuntu(修改root信息)
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (九十四)函数和二维数组
  • (十五)使用Nexus创建Maven私服
  • (转)大道至简,职场上做人做事做管理
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .net FrameWork简介,数组,枚举
  • .Net IE10 _doPostBack 未定义
  • .net refrector
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET/C# 的字符串暂存池
  • .NET程序员迈向卓越的必由之路
  • .NET构架之我见
  • .NET教程 - 字符串 编码 正则表达式(String Encoding Regular Express)
  • .NET使用存储过程实现对数据库的增删改查
  • .net中我喜欢的两种验证码
  • //解决validator验证插件多个name相同只验证第一的问题
  • @Mapper作用