Visual studio c++ 2017 动态链接库的创建和使用总结
一动态链接库的创建两种方式:
1、只有从文件->新建->项目->Windows桌面-> Windows桌面向导->选择“动态链接
库(.dll)->生成解决方案,才会生成.dll和.lib文件。
(1)在头文件声明中(注意要在头文件变量和函数声明中,而不是在变量和函数的定义中声明),不加extern “C”修饰,编译成DLL后,用depends.exe查看导出函数名。
可以看出,导出的函数名都被编译器篡改了。
(2)在头文件声明中,变量和函数名前加extern “C”修饰后,编译成DLL后,再用depends.exe查看导出函数名。
可以看出,用extern “C”修饰的函数名,编译后函数名保持不变。
类及成员函数不能用extern “C”修饰,编译成DLL后,成员函数名发生了改变。
2、如果从文件->新建->项目->动态链接库(DLL)->生成解决方案,就只生成.dll,不生成.lib。
二动态链接库的调用两种方式:
1、显式调用
(1)使用显式调用的前提:创建的DLL,编译时不要篡改函数名称,定义函数名时,可用extern “C”修饰函数名,保证编译时,函数名不被篡改。
否则GetProcAddress( )不能正确地获取dll中的函数名。
但是导出的类不能使用extern “C”修饰。
(2)使用显式调用的优点:不用动态链接库的.h和.lib文件,只要有.dll文件就可调用库函数,使用LoadLibrary(),在需要调用.dll中的库函数时,才动态加载到内存中,使用完毕后,可以用FreeLibrary()释放内存中的dll;使用GetProcAddress( )获取dll中的函数名。
必须事先知道dll中的函数名和形式参数。
(3)使用显式调用缺点:调用每个函数时,都必须使用 GetProcAddress( )获取dll中的函数名,并转换成原来的函数,比较麻烦。
而隐式调用DLL函数,由于使用了DLL的头文件.h,使用起来非常方便。
2、隐式调用
(1)隐式调用DLL函数缺点:
应用程序加载时,在内存中载入DLL动用库中的函数、变量、或类。
使用完毕后,DLL 也不会从内存中释放。
.lib包含了库函数的入口,但不包含函数代码,应用程序调用时,才从dll中载入。
(2)隐式调用DLL函数优点:
应用程序调用dll时,需要.lib和.h文件,在应用程序.exe文件夹debug或者release 中有DLL文件,即.h、.lib和.dll三个文件,在应用程序中直接使用DLL中的类和函数,可以不考虑编译DLL函数和变量名发生改变的问题。
不需要像显式调用那样,函数需要
用 GetProcAddress( )一一获取。
隐式调用DLL中的变量、函数和类,有两种方法:
(1)在主程序中包含DLL的头文件dll.h,在main( )前加上#pragma
comment(lib,”dll.lib”),没有分号,再在debug或release中复制DLL.dll。
(2)在主程序中包含DLL的头文件dll.h,在项目属性->链接器->添加依赖项中加上“dll.lib;“,再在debug或release中复制DLL.dll,即可。
隐式调用DLL中的变量、函数和类,由于使用了DLL头文件声明,调用起来非常方便。
不需要用GetProcAdress( )逐句获取函数名。
使用显式调用LoadLibrary(),只能调用DLL 中的函数,不能调用DLL中类和成员函数。