VS2017环境下动态链接库编写及调用

最近项目中有用到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:

扫描二维码关注公众号,回复: 5844305 查看本文章

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

猜你喜欢

转载自blog.csdn.net/shimadear/article/details/89202714