您的位置:首页 > 其它

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

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