VS2015_动态链接库学习

时间:2024-08-15 08:33:21

非MFC动态链接库

创建一个名为ex1的Win32项目
VS2015_动态链接库学习

创建一个DLL项目,保留预编译的头文件
 VS2015_动态链接库学习

默认文件

创建完成项目之后,包含几个默认的文件
 VS2015_动态链接库学习
stdafx.h文件用于包含标准系统包含的头文件

VS2015_动态链接库学习

 对应于stdafx.cpp文件,主要包含stdafx.h的头文件

VS2015_动态链接库学习

 targetver.h主要用于定义dll可以使用的最高的Windows版本

VS2015_动态链接库学习

 dllmain.cpp用于定义dll的程序入口点

VS2015_动态链接库学习

 dllmain函数是加载dll时候的入口函数
创建ex1.h文件,定义导出的变量和导出的函数

VS2015_动态链接库学习

 可以快速创建文件,在dllmain.cpp中定义add和sub的函数
 VS2015_动态链接库学习
  可以修改dllmain.cpp文件,定义程序入口函数处,设置Num=100
 VS2015_动态链接库学习
 编译函数,得到dll文件

VS2015_动态链接库学习

使用Dependency查看DLL的情况

如果没有找到可以独立下载:http://www.dependencywalker.com/ 
发现我们定义好的函数和变量
VS2015_动态链接库学习
这里的Function定义都有明确的含义,C++默认使用__cdecl调用的约定 
VS2015_动态链接库学习

DLLMain函数
Windows在加载DLL的时候,需要一个入口函数,即DLLMain函数。如果没有为DLL编写一个DLLMain函数,则系统会自动引入一个不做任何处理的默认DLLMain函数
函数内部根据dll被加载的原因进行不同的操作
名称 作用 备注
DLL_PROCESS_ATTACH 进程被调用,DLL被连接到当前进程并被初始化
DLL_THREAD_ATTACH 当前进程创建一个新线程,DLL在新线程内被调用
DLL_PROCESS_DETACH 调用DLL的进程被终止,DLL被卸载
DLL_THREAD_DETACH 调用DLL的线程被终止,DLL被卸载
 VS2015_动态链接库学习

DLL库的调试

由于dll文件不能单独调试,所以需要创建一个调试dll工程的project,这里创建一个Win32的控制台应用程序
VS2015_动态链接库学习
创建完成后,将这个项目设置为启动项

VS2015_动态链接库学习

应用过程使用隐式链接方式调用ex1.dll文件

DLL生成的时候,会配套生成一个LIB文件,这个文件中定义了DLL的变量和函数
DLL加载的过程中,Windows将按照如下的顺序来定位DLL
- 包含EXE文件的目录
- 进程的当前工作目录
- Windows系统目录
- Windows目录
- 列在PATH环境变量中的一系列目录
将LIB库文件添加到项目中,一共有3中方法
1.通过属性配置附加依赖项

VS2015_动态链接库学习

 加载完成后,声明一下来自外部的函数,即可在后文去应用这些函数了
 VS2015_动态链接库学习
 2.通过程序代码中添加LIB文件导入
先删除程序配置中的附加依赖项,然后尝试编译,发现无法通过编译
VS2015_动态链接库学习
在语句中添加LIB导入内容

VS2015_动态链接库学习

这里需要注意的是,附加目录库需要指定

VS2015_动态链接库学习

  3.通过文件的方式直接添加LIB文件

VS2015_动态链接库学习

应用工程以显示连接方式调用ex1.dll文件

显示调用需要使用代码的方式链接dll,使用显式链接方式可以在应用程序执行过程中随时加载DLL,也可以随时卸载DLL,这是隐式无法做到的。
好处:可以在启动程序时,不必将所有的应用DLL一起加载到DLL内存中,只有在使用某个DLL的时候才会载入,这样可以减少应用程序初始化加载的时间,可以降低内存的使用

这里暂时不做过多深入,等后续需要的使用继续学习



使用非MFC DLL 导出类

如果建立的DLL不需要使用MFC,为了节约磁盘和内存空间,可以建立非MFC动态库
创建一个ex2的非MFC动态链接库
VS2015_动态链接库学习
新建一个头文件ex2.h,在这个头文件中定义一个类

VS2015_动态链接库学习

 使用Dependency可以查看类的导出内容,比较复杂,所以不适合使用def的方式进行

VS2015_动态链接库学习

 为了测试我们的DLL,新建一个Console工程进行测试

VS2015_动态链接库学习

如果要调用lib文件,可以使用Solution的相对路径来完成项目库的导入操作

VS2015_动态链接库学习