专用 DLL:通过专用 DLL 可以使程序避免遭受对共享 DLL 进行的更改。专用 DLL 使用版本特定信息或空 .local 文件来强制要求程序所使用的 DLL 的版本。要使用专用 DLL,请在程序根文件夹中查找 DLL。然后,对于新程序,请向该 DLL 中添加版本特定信息。对于旧程序,请使用空 .local 文件。每个方法都告诉操作系统使用位于程序根文件夹中的专用 DLL。 http://www.paper51.com 3.2.3 DLL的不同类型 内容来自论文无忧网 www.paper51.com 使用MFC可以生成两种类型的DLL:MFC扩展DLL和常规DLL。常规DLL有可以分为动态连接和静态连接。Visual C++还可以生成WIN32 DLL,但不是这里讨论的主要对象。 内容来自www.paper51.com 3.2.3.1 MFC扩展DLL paper51.com 每个DLL都有某种类型的接口:变量、指针、函数、客户程序访问的类。它们的作用是让客户程序使用DLL,MFC扩展DLL可以有C++的接口。也就是它可以导出C++类给客户端。导出的函数可以使用C++/MFC数据类型做参数或返回值,导出一个类时客户端能创建类对象或者派生这个类。同时,在DLL中也可以使用DLL和MFC。 Visual C++使用的MFC类库也是保存在一个DLL中,MFC扩展DLL动态连接到MFC代码库的DLL,客户程序也必须要动态连接到MFC代码库的DLL。(这里谈到的两个DLL,一个是用户自己编写的DLL,一个装MFC类库的DLL)现在MFC代码库的DLL也存在多个版本,客户程序和扩展DLL都必须使用相同版本的MFC代码DLL。所以为了让MFC扩展DLL能很好的工作,扩展DLL和客户程序都必须动态连接到MFC代码库DLL。而这个DLL必须在客户程序运行的计算机上。 http://www.paper51.com
3.2.3.2 常规DLL 内容来自www.paper51.com
使用MFC扩展DLL的一个问题就是DLL仅能和MFC客户程序一起工作,如果需要一个使用更广泛的DLL,最好采用常规DLL,因为它不受MFC的某些限制。常规DLL也有缺点:它不能和客户程序发送指针或MFC派生类和对象的引用。一句话就是常规DLL和客户程序的接口不能使用MFC,但在DLL和客户程序的内部还是可以使用MFC。 当在常规DLL的内部使用MFC代码库的DLL时,可以是动态连接/静态连接。如果是动态连接,也就是常规DLL需要的MFC代码没有构建到DLL中,这种情况有点和扩展DLL类似,在DLL运行的计算机上必须要MFC代码库的DLL。如果是静态连接,常规DLL里面已经包含了需要的MFC代码,这样DLL的体积将比较大,但它可以在没有MFC代码库DLL的计算机上正常运行。 copyright paper51.com
3.2.4 DLL 的函数调用 内容来自论文无忧网 www.paper51.com 当您在应用程序中加载 DLL 时,可以使用两种链接方法来调用导出的 DLL 函数。这两种链接方法是加载时动态链接和运行时动态链接。 内容来自论文无忧网 www.paper51.com
加载时动态链接: paper51.com 在加载时动态链接中,应用程序像调用本地函数一样对导出的 DLL 函数进行显式调用。要使用加载时动态链接,请在编译和链接应用程序时提供头文件(.h) 和导入库文件 (.lib)。当您这样做时,链接器将向系统提供加载 DLL 所需的信息,并在加载时解析导出的 DLL 函数的位置。 内容来自www.paper51.com
运行时动态链接: http://www.paper51.com
在运行时动态链接中,应用程序调用LoadLibrary 函数或 LoadLibraryEx 函数以在运行时加载 DLL。成功加载 DLL 后,可以使用 GetProcAddress 函数获得要调用的导出的 DLL 函数的地址。在使用运行时动态链接时,无需使用导入库文件。下面说明了有关何时使用加载时动态链接以及何时使用运行时动态链接的应用程序条件: copyright paper51.com
启动性能: 内容来自www.paper51.com 如果应用程序的初始启动性能很重要,则应使用运行时动态链接。 paper51.com 易用性: 内容来自www.paper51.com
在加载时动态链接中,导出的 DLL 函数类似于本地函数。这使您可以方便地调用这些函数 paper51.com 应用程序逻辑: 内容来自论文无忧网 www.paper51.com 在运行时动态链接中,应用程序可以分支,以便按照需要加载不同的模块。在开发多语言版本时,这一点很重要。 copyright paper51.com |