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

来源:互联网 发布:mac 日历 软件 编辑:程序博客网 时间:2024/06/06 00:52
 

在学习过程中,一次次的感觉到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” 里面找。