最近项目中有用到DLL,于是就去了解了一下动态链接库(DLL)以及基本的的编写方法。先来区分一下静态库和动态库:

静态库 window下是 .lib格式  linux下是 .a格式 编译期引入到程序代码 -l

动态库 window下是 .dll格式  linux下是 .so格式 运行时候进行链接

DLL(Dynamic Link Library)文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。

我们平常在安装游戏,安装软件的时候,有的时候就会提示你,无法打开。。。由于缺失。。。.dll文件,请重新安装。这就是由于安装过程中丢失了某种dll文件产生的。其实就是在生成的可执行文件想要运行时,必须有相应的DLL来辅助。

简单的说,DLL有以下几个优点:

1)      节省内存。同一个软件模块,若是以源代码的形式重用,则会被编译到不同的可执行程序中,同时运行这些exe时这些模块的二进制码会被重复加载到内存中。如果使用dll,则只在内存中加载一次,所有使用该dll的进程会共享此块内存(当然,像dll中的全局变量这种东西是会被每个进程复制一份的)。

2)      不需编译的软件系统升级,若一个软件系统使用了dll,则该dll被改变(函数名不变)时,系统升级只需要更换此dll即可,不需要重新编译整个系统。事实上,很多软件都是以这种方式升级的。例如我们经常玩的星际、魔兽等游戏也是这样进行版本升级的。

3)      Dll库可以供多种编程语言使用,例如用c编写的dll可以在vb中调用。这一点上DLL还做得很不够,因此在dll的基础上发明了COM技术,更好的解决了一系列问题。

下面开始编写我的第一个DLL:

1.文件->新建->项目->选择Visual C++->Windows桌面->动态链接库

2. 可以看到解决方案自带两个头文件stdafx.h和targetver.h。

3.右键头文件->添加->新建项->选择头文件,新建一个first.h。这个头文件里面有一个#pragma once,这个东西保证头文件只被编译一次。

4.先写源文件first.cpp,定义DLL应用程序的导出函数,写一个彩色字体的输出,函数名为show()

#include "stdafx.h"#include "first.h"
#include <Windows.h>
#include <iostream>
using namespace std;
void show()
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);cout << "Hello";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_GREEN);cout << " World";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE);cout << "!";SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED | FOREGROUND_BLUE);cout << "二丢丢。";
}

5.再写头文件first.h。在要输出的函数前加上 __declspec(dllexport),表示输出。

#pragma once__declspec(dllexport) void show();

6.生成解决方案。

可以在项目文件夹的Debug目录下看到dll和lib文件。lib是我们写在程序中添加的文件,dll是我们在生成程序之后要使用的文件。

7.测试DLL。新建一个控制台应用程序:文件->新建->项目

 把刚才DLL项目中的first.h和生成的lib文件复制到test项目根目录下:

刚刚生成的dll文件放到Debug目录(没有这个目录就先生成解决方案,有了Debug目录后再放文件进来,一切准备好以后再重新生成解决方案):

其中,要在项目->属性->C/C++->代码生成->运行库->改成DLL(/MDd)

然后在右侧头文件中添加first.h,资源文件中添加lib

注意:这里first.h的写法和DLL项目中first.h的写法是对应的。函数名前加__declspec(dllimport),表示输入。

编写test.cpp:

// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include "pch.h"
#include <iostream>#include "first.h"
int main()
{show();while (true){}return 0;
}

重新生成解决方案。test的Debug文件夹里可以看到可执行文件test.exe。运行:

========================================================================

参考博客: https://blog.csdn.net/Call_Coder/article/details/79331686

VS2017环境下动态链接库编写及调用相关推荐

  1. Win32环境下动态链接库(DLL)编程原理

    Win32环境下动态链接库(DLL)编程原理 比较大应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作.其中可能存在一些模块的功能较为通用,在构造其它软件系 ...

  2. 在 windows 环境下,编写一个批处理程序(算命大师.bat)

    在 windows 环境下,编写一个批处理程序(算命大师.bat) 标题 在 windows 环境下,编写一个批处理程序(算命大师.bat) **题目:**在 windows 环境下,编写一个批处理程 ...

  3. 操原上机(一)在 Windows 环境下,编写一个批处理程序(算命大师.bat)

    要求 在 Windows 环境下,编写一个批处理程序(算命大师.bat),程序运行后,输入:出生年月日(例如 2000-07-31).系统输出相应的属相和星座,例如:你属兔, 狮子座.要求:输入进行合 ...

  4. 如何在win10+VS2017环境下新建一个简单的WDF示例程序

    上一课我们在win10系统+VS2017开发环境下搭建了WDK驱动程序开发环境的搭建,详见我的博客[如何在win10+VS2017环境下安装USB驱动开发套件WDK],今天我们来尝试建立一个最简单的K ...

  5. qt+vs2017环境下XIMEA相机库的配置

    从第一篇博客出来之后就没再更新过博客,这一次再更新博客的时候已经是换了项目了,现在在搞双目视觉方面.刚开始接触这一方面,前几天一直在研究相机原本的库函数的调用问题 网上这一方面的很少,而且很多都是在u ...

  6. C语言在VS2017环境下写俄罗斯方块的感悟

    C语言给几乎所有人的印象就是语法太严格.使用太拘谨,错误特别多,纠结太细致.很难提起兴趣来.同时还有如下的巨大弱势: 1:C语言写了很久还是只开发黑窗口程序,看不到实际应用在哪里,严重打击兴趣: 2: ...

  7. python vtk_VTK在python环境下的安装和调用

    vtk,很好玩的一个可视化工具,有python接口. 一.安装: 1.平台:window7, python2.7 2.下载vtk: vtkpython-7.1.1-Windows-64bit.exe ...

  8. VS2017环境下GMap的学习及开发(一)

    我本人自学GMap走了不少弯路,希望这些文章能帮助到大家快速上手! GMap环境配置 下载GMap 打开官网GMap.net,点击download archive 进行下载并解压. 运行GMap 找到 ...

  9. Kettle【实践 01】Linux环境下使用Azkaban定时调用Kettle的KJB或KTR脚本实现自动化数据处理(完整流程实例分享:包含sql+ktr+shell+flow相关文件云资源)

    资源链接在文章末尾,包含文件: 1. 说明 Kettle 的 KJB 或 KTR 调用使用的 shell 脚本,小伙伴可能会想,可以用 Linux 的 crontab 进行任务的调度啊,为什么需要 A ...

最新文章

  1. VC++ MFC中如何将应用程序的配置信息保存到注册表中(一)
  2. NYOJ 6 喷水装置(一) 贪心算法 之 区间覆盖问题
  3. mac删除ssh key_SecureCRT for mac(好用的终端SSH仿真工具)
  4. LeetCode hard 668. Kth Smallest Number in Multiplication Table(二分答案)
  5. 如何处理错误消息Query XXX is invalid or contains errors
  6. 【转】通用sqlserver分页存储过程
  7. php接收get参数false是字符串,php怎么接收url参数
  8. cxGrid 怎样才能让不自动换行 WordWrap:=false
  9. linux_shell/windows_powershell_变量/环境变量Path的分行/换行查看/关键字搜索环境变量是否已经存在相关的变量的一些函数(cmdlet)表达式
  10. Java零基础学习021-API进阶第二天
  11. UltraLAB台式图形工作站(图形+超算+私有云通吃~图灵超算工作站介绍)
  12. DNS是什么?DNS什么用?
  13. be [prove] a great boon to [for]
  14. pytorch 画loss曲线_Python练习绘制损失曲线,Pytorch,Loss
  15. Datawhale集成学习笔记:熟悉机器学习的三大主要任务
  16. 一文讲透,技术人如何快速提升沟通能力?
  17. Linuxnbsp;用命令行打开docnbsp;pdf…
  18. 【服务器数据恢复】服务器断电导致RAID报错的数据恢复案例
  19. 相较国外代码托管平台 gitlab,咱们中国自己的代码托管平台有哪些优势?
  20. 【嵌入式学习】嵌入式开发的第一课

热门文章

  1. python解压缩tar.gz文件
  2. linux下用grep命令根据文件内容进行关键字搜索[linux ubuntu grep] -转
  3. [Java] 蓝桥杯ADV-233 算法提高 队列操作
  4. [swift] LeetCode 20. Valid Parentheses
  5. 蓝桥杯 ALGO-49 算法训练 寻找数组中最大值
  6. L2-003. 月饼-PAT团体程序设计天梯赛GPLT
  7. Zipkin分布式任务追踪
  8. informix数据库启动/停止
  9. UnityWebform(2):自定义LifetimeManager和TypeConverter使Unity从HttpContext中取值注入WebForm页面...
  10. 题解 LGOJ P4168 【[Violet]蒲公英】