您的位置:首页 > 其它

动态链接库创建与使用(学习笔记)

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文件。




方法二:(添加一个*.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 *.dll
l 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” 里面找。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: