动态链接库创建与使用(学习笔记)
2011-06-21 16:32
549 查看
在学习过程中,一次次的感觉到dll文件的重要性,所以乘着这两天有时间,又把孙鑫老师的视频回顾了一遍,随便做了一下笔记,以供后续使用。
IDE:Visual C++ 6.0创建动态链接库的方法
方法一:(单个*.cpp文件)1. 新建dll工程
2. 添加C/C++源文件(c++)
3. 在源文件中,编写函数(每个函数结尾不需要‘;’)(如下图)
4. 在需要导出的函数前加 _declspec(dllexport)
5. 编译连接即可,获得dll和lib文件。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/06a170a42b28b26c10522ac8709b2529.gif)
方法二:(添加一个*.h头文件)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/74ddbd04e370c08c42d68d6815e06b2b.gif)
方法三:(添加一个*.h头文件,并使该头文件可以被dll文件使用,也可以被用户使用)
当使用dll文件时,会将DLL1_API定义为export,供输出使用
当客户直接用.h文件时,会将DLL1_API定义为import,供输入使用
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/b85c27e7da0c47147d3c8824669ca62a.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/1c3521510d85cd8c116d2fe2b48f1dee.gif)
方法四:(导出类)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/017daa66548e8aeaf59742b34ad9a1ee.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/535f740280fe29b4dc5fa486c55dd8f2.gif)
方法五:(导出类的部分域和方法)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/657ca1d076420378679e72acde31fc42.gif)
方法六:(防止名字改编)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/f6ef41cec87b5f2ea44358305587cdb3.gif)
由上图可见,函数名字发生改编了。
这种改编和编译器相关,所以当同一个dll文件放到不同的编译器上时,就可能因为名字改编问题,使得函数不可以使用。
方法:使用extern “C”
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/02a575f1e9a66eb0979a4493f380ba99.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/95613255527f47b961f2d97a26b6e8a6.gif)
结果如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/4ec1fc51ad9214ee6dd204cdd762d645.gif)
Extern “C”不足:
l 只能导出全局函数,不能导出类和类的成员函数。
以下两种都出错。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/872225c11513d02e357b558740c88aed.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/f0ce5a7b758ca7426270a81c46e89d53.gif)
l 调用约定发生变化时,名字改编就变化。
如将默认的C调用,改为标准调用_stdcall(即Pascal调用)
*.h文件中
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/8f6fc86b9c76b74d2227413a45c23341.gif)
*.cpp文件中
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/310b0036c754a59021f22853a44d7fc2.gif)
Dumpbin 结果如下,发生名字改编。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/fde63a366a5bc876ed05f9819c8e2df5.gif)
彻底消除名字改编,使用模块定义文件*.def
方法六:(使用*.def文件)
只要在工程中加入一个*.def文件,即可。
*.h文件,照样可以使用。
该*.def只是在生成动态链接库时使用,其它地方都不用。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/d24489b043b541d7353afa5ebb1d00f8.gif)
Dumpbin结果如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/67fd1fa0bda4d537b018957e7f7ac329.gif)
没有发生名字改编
使用动态链接库的方法
隐式链接
1. 连接时,只需要提供引入库文件(*.lib)2. 运行时,需要提供动态链接库文件(*.dll)
方法一:
1. 将lib文件复制到当前工程,工程à设置à连接,添加*.lib文件名
2. 程序中使用dll中函数前,用extern 函数声明
(以上两步,就可以保证使用dll文件中的函数时,编译连接不出错)
3. 将dll文件复制到当前工程,运行程序即可!
方法二:
基本同方法一,只是第二步改为:
不使用extern
使用_declspec(dllimport) (效率更高)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/7b6026758fda1d838f5ad777ecd096bb.gif)
方法三:
基本同方法一,只是第二步改为:
不使用extern ,通过包含 *.h头文件,就省略了extern 、_declspec(dllimport)等声明了。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/71fb0142edb3f9402c5427f5f3227620.gif)
动态加载
方法四:将*.dll拷贝到当前工程目录下,即可。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/383d37e6c93092386c8e9ece58927b89.gif)
使用FreeLibrary释放dll文件
也可以使用MAKEINTRESOURCE宏
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/5c4011408ffa477ef7f4b9ae5276b5c3.gif)
利用Dumpbin命令查看应用程序的输入:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/07/e8b876f45c03b29991e00b142b49eca0.gif)
可见,testDll中没有加载Dll2.dll文件,这个文件是在使用时动态加载的。
工具
Dumpbin 命令
l Dumpbin –exports *.dlll Dumpbin –imports *.exe
如果没有设置环境变量,先运行VCVARS32.BAT文件。
Depends可视化工具
查看一个可执行模块(dll或exe文件)依赖的dll文件。工具路径:开始--> 程序—>Microsoft Visual Studio 6.0 à Microsoft Visual C++ 6.0 Toolsà Depends
如果没有找到,可以到安装目录 “C:/Program Files/Microsoft Visual Studio/Common/Tools” 里面找。
相关文章推荐
- 动态链接库创建与使用(学习笔记) .
- 动态链接库创建与使用(学习笔记)
- 【C++学习笔记】使用new创建动态结构
- NDK学习笔记:动态链接库与静态链接库的基本使用流程简记
- C++学习笔记四之使用new来创建动态数组
- [cocos2dx笔记013]一个使用CCRenderTexture创建动态纹理显示数字的类
- linux的动态链接库的创建和使用
- Windows编程 C++ DLL编程 学习笔记(一)静态链接库的创建和使用
- linux学习笔记1:使用VM创建一台虚拟机
- Spring学习笔记 使用Non-Static Factory(非静态工厂类)创建Bean
- Mybatis学习笔记七:动态SQL语句的使用
- 设计模式学习(十四)————抽象工厂模式(使用Qt框架的反射技术——根据字符串动态创建类来实现)
- 【C++学习笔记】使用New来创建动态数组
- Dll学习二_Dll 窗体中动态创建数据并使用Demo
- C# step by step 学习笔记8 CHAPTER 9 使用枚举和结构创建值类型
- Python爬虫(入门+进阶)学习笔记 1-8 使用自动化神器Selenium爬取动态网页(案例三:爬取淘宝商品)
- [原创]W2k Driving 学习笔记(二)使用GCC创建 Windows NT 下的内核DLL
- ZendFramework2学习笔记 动态创建表和日志
- 第60课:使用Java和Scala在IDE中实战RDD和DataFrame动态转换操作学习笔记
- MySQL学习笔记--触发器的创建与删除及使用注意事项