动态链接库创建与使用(学习笔记) .
2011-11-11 16:59
495 查看
在学习过程中,一次次的感觉到dll文件的重要性,所以乘着这两天有时间,又把孙鑫老师的视频回顾了一遍,随便做了一下笔记,以供后续使用。
IDE:Visual C++ 6.0创建动态链接库的方法
方法一:(单个*.cpp文件)1. 新建dll工程
2. 添加C/C++源文件(c++)
3. 在源文件中,编写函数(每个函数结尾不需要‘;’)(如下图)
4. 在需要导出的函数前加 _declspec(dllexport)
5. 编译连接即可,获得dll和lib文件。
方法二:(添加一个*.h头文件)
方法三:(添加一个*.h头文件,并使该头文件可以被dll文件使用,也可以被用户使用)
当使用dll文件时,会将DLL1_API定义为export,供输出使用
当客户直接用.h文件时,会将DLL1_API定义为import,供输入使用
方法四:(导出类)
方法五:(导出类的部分域和方法)
方法六:(防止名字改编)
由上图可见,函数名字发生改编了。
这种改编和编译器相关,所以当同一个dll文件放到不同的编译器上时,就可能因为名字改编问题,使得函数不可以使用。
方法:使用extern “C”
结果如下:
Extern “C”不足:
l 只能导出全局函数,不能导出类和类的成员函数。
以下两种都出错。
l 调用约定发生变化时,名字改编就变化。
如将默认的C调用,改为标准调用_stdcall(即Pascal调用)
*.h文件中
*.cpp文件中
Dumpbin 结果如下,发生名字改编。
彻底消除名字改编,使用模块定义文件*.def
方法六:(使用*.def文件)
只要在工程中加入一个*.def文件,即可。
*.h文件,照样可以使用。
该*.def只是在生成动态链接库时使用,其它地方都不用。
Dumpbin结果如下:
没有发生名字改编
使用动态链接库的方法
隐式链接
1. 连接时,只需要提供引入库文件(*.lib)2. 运行时,需要提供动态链接库文件(*.dll)
方法一:
1. 将lib文件复制到当前工程,工程à设置à连接,添加*.lib文件名
2. 程序中使用dll中函数前,用extern 函数声明
(以上两步,就可以保证使用dll文件中的函数时,编译连接不出错)
3. 将dll文件复制到当前工程,运行程序即可!
方法二:
基本同方法一,只是第二步改为:
不使用extern
使用_declspec(dllimport) (效率更高)
方法三:
基本同方法一,只是第二步改为:
不使用extern ,通过包含 *.h头文件,就省略了extern 、_declspec(dllimport)等声明了。
动态加载
方法四:将*.dll拷贝到当前工程目录下,即可。
使用FreeLibrary释放dll文件
也可以使用MAKEINTRESOURCE宏
利用Dumpbin命令查看应用程序的输入:
可见,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来创建动态数组
- 【C++学习笔记】使用new创建动态结构
- NDK学习笔记:动态链接库与静态链接库的基本使用流程简记
- libevent学习笔记【使用篇】——2. 获取(创建)event_base
- javascript dom编程艺术学习笔记之动态创建标记
- php类的创建和使用--php学习笔记(1)
- Windows编程 C++ DLL编程 学习笔记(一)静态链接库的创建和使用
- Python下字符串的创建和转义字符的使用 - 千月的python linux 系统管理指南学习笔记(10)
- 如何创建和使用动态链接(dll)和静态链接(lib),全面总结
- Linux学习笔记3--linux下库文件的创建和使用及其他
- IOS开发学习笔记019-动态创建控件
- 我的python学习笔记.创建和使用类
- linux下使用eclipse编译、链接、动态库的学习笔记
- HBase 学习之一 <<HBase使用客户端API动态创建Hbase数据表并在Hbase下导出执行>>
- C++动态内存创建与内存管理学习笔记[4]
- 不错的maven学习笔记,收藏——Maven学习 (三) 使用m2eclipse创建web项目
- Maven学习笔记----使用Maven创建Java项目
- sqlite学习笔记8:C语言中使用sqlite之创建表