Windows下动态链接库的使用

来源:互联网 发布:战网美服客户端 mac 编辑:程序博客网 时间:2024/05/06 04:00
Windows下动态链接库的使用 - 上帝有罪 - 上帝有罪的博客(2012-10-18 15:01:23)
te style="font-style: normal;line-height: 23px; padding: 0px 20px 0px 32px; display:inline-block !important; height: 23px; min-width: 1px;overflow-x: visible; width: 34px; background- -28px;background-repeat: no-repeat no-repeat; background-color: rgb(153,51, 0);" >Windows下动态链接库的使用 - 上帝有罪 - 上帝有罪的博客转载▼te>
标签: 

动态链接库

 

函数

 

源代码

 

头文件

 

使用

分类: Cpp
IDE: VisualStudio 2010

一、引子
动态链接库:相比静态链接库,动态链接库是一个复杂得多,也牛逼得多的概念。
动态链接库的使用,同样需要.lib文件的支持,不过此lib非彼lib,区别如下:
1)静态链接库中的Lib(目的码链接库):包含所需的源代码,编译时其中的代码加入到主程序中,编译后就不再需要该Lib,属于一次性用品;
2)动态链接库中的Lib(引用链接库):引用链接库不包含源代码,而是存储了对应的动态链接库名称和期中函数的引用信息。它的作用是是为Linker提供信息,以便在.exe文件中建立动态链接时要用到的复位位表。同样是个一次性用品。之后在程序运行过程中,就可以根据复位位表来调用.dll了。
P.S:复位位表:windows程序设计(第五版)里“动态链接库”部分的概念,书中没有对其进行描述。目前我自己也不太明白,暂且留白。。

二、创建
创建一个dll的过程也很简单,分别有两种方法。(因为Microsoft搞了个MFC出来。。)
1)显式声明函数为dllexport:
Windows下动态链接库的使用
配置时选择dll:
Windows下动态链接库的使用
在源代码目录下自动生成了一个DllMain.cpp文件,如:
Windows下动态链接库的使用
这里定义了dll默认的入口函数(当然,不一定要有),它的具体描述见百度百科,以下是特快专列:
http://baike.baidu.com/view/3549543.htm
当然,它和本文重点没啥关系。。。向LxyDll中添加Func.h和Func.cpp哥俩,和静态链接库中的完全一样。编译后,就得到了LxyDll.dll和引用链接库文件LxyDll.lib,如下:
Windows下动态链接库的使用
注意LxyDll.lib的大小,仅为2KB,还不到之前目的码链接库的零头,可见其中是不存放源代码的。

2)仿MFCDll创建:
在MFC中,创建DLL时不需要设置函数为dllexports,而是通过一个.def文件,来指出可供其他程序调用的函数。
创建LxyLikeMFCDll项目:
Windows下动态链接库的使用
设置为Dll:
Windows下动态链接库的使用
同之前一样,添加Func.h和Func.cpp文件后,向源文件目录添加.def文件(模块定义文件):
(P.S:模块定义文件的详细说明见此帖,此处为特快专列二号:
http://www.cppblog.com/FateNo13/archive/2009/08/24/94224.html)
Windows下动态链接库的使用
.def文件其实是个文本文件,里面记录了动态链接库的名称和其中可供外部程序调用的函数名(是函数名而不是原型),编译后即得到LxyLikeMFCDll.dll和LxyLikeMFCDll.lib。
3)两种方法的对比:
事实上,创建一个dll的过程可分为如下3步:
A、提供DllMain入口(如果是资源型的dll可以没有。不过,让我用一个空项目搭出一个dll,我不知道该如何让编译器“知道”这是一个dll而不是一个exe文件。);
B、提供dll中的源代码(像在exe中一样);
C、指出源代码中哪些部分(变量、函数等)是可供外部程序访问的。
以上指出的两种办法的不同也体现在第三步上,两种方式杂交使用也是可以的。

三、使用
这是体现出动态链接库文件灵活方便的地方,有隐式调用显式调用两种方式:
1)隐式调用:
创建主程序UseLxyMFCDll,将Func.h、LxyLikeMFCDll.dll和LxyLikeMFCDll.lib复制到源代码目录下。
P.S:头文件Func.h并不是必需的,只是C++中使用外部函数时,需要先进行声明。将头文件导入,既方便省事,又不会出错。如果只需要使用其中的少量函数,那么在主程序的代码中手动声明也是可以的。)
在程序中指定链接引用链接库LxyLikeMFCDll.lib:
Windows下动态链接库的使用
编译并运行,结果如下:
Windows下动态链接库的使用

2)显式调用:
修改一下UseLxyMFCDll,如下:
Windows下动态链接库的使用

这种办法不需要lib文件,也不需要函数声明(因此也不需要Func.h头文件),而是通过LadLibrary()和GetProcAddress()来获取需要的函数实体,显得很“动态”,如同分配堆内存一般。当然不能忘记用完就释放的原则。Windows下动态链接库的使用
 
0 0