动态链接库DLL

简介: 动态链接库DLL 一、介绍 动态链接库DLL(Dynamic Link Library)是Windows的组成要素之一,是包含共享函数库的二进制文件,可以被多个应用程序同时使用。

动态链接库DLL



一、介绍
动态链接库DLL(Dynamic Link Library)是Windows的组成要素之一,是包含共享函数库的二进制文件,可以被多个应用程序同时使用。DLL也是包含了一系列类、函数、变量或其它资源的库文件。

一些常用的资源如图标、位图、字符串和对话框之类的资源,做到DLL中,可为多个应用程序共享。这就是纯资源DLL,也即只包含资源的DLL,其资源可以是字符串、数组、图标、位图、声音、视频或对话框等。

可用DLL实现程序的不同语言界面。

动态链接库DLL提供了一种共享数据和代码的方便途径。由于多个应用程序可共享同一DLL的函数,故使用DLL可节省磁盘空间和内存空间。也便于程序功能的扩展和升级。还便于多语言开发、模块化设计。

VC、C++ Builder、Delphi等都可以编写DLL文件。不同语言编写的程序可共享同一个DLL程序。

DLL不能单独运行,只能由可执行文件或其它DLL文件调用。

二、DLL的特性
1、DLL不是独立运行的程序,而是应用程序的一部分,只能由所属的程序调用。

2、如没有DLL说明文档,则难以调用DLL。因为DLL只包括函数的名字,不包括函数的参数和调用方法等信息。
使用VC的dumpbin(bin目录下)或Delphi的TDump,可查看DLL包括哪些函数,但不能看到具体信息。

三、调用DLL的方式
1、静态调用DLL
静态调用需要LIB库文件和DLL文件。程序编译时需用LIB文件,系统编译时DLL会编译进程序。应用程序发布时,不再需要LIB文件。

注:DLL的编写与编程语言无关,只需遵守DLL接口规范。

2、动态调用DLL
如没有与DLL相关联的LIB文件,则须使用动态调用。也必须知道函数返回值的类型和传递的参数个数、类型和顺序。

使用动态调用的应用程序在调用DLL中的导出函数前,必须使用loadlibrary()函数加载DLL,并得到一个模块句柄,然后使用该句柄调用getprocaddress()函数获得所需调用的导出函数的指针,通过该指针调用DLL中的导出函数。

使用动态调用DLL的应用程序不需要相应的LIB文件。

使用完毕后,还需要调用freelibrary()函数释放加载的DLL。

 三、DLL问题
1、如何了解某应用程序使用哪些DLL文件
右键单击该应用程序并选择快捷菜单中的“快速查看”命令,在随后出现的“快速查看”窗口的“引入表”一栏中你将看到其使用DLL文件的情况。

2、如何知道DLL文件被几个程序使用
运行Regedit,进入HKEY_LOCAL_MACHINESoftwareMicrosrftWindowsCurrentVersionSharedDlls子键查看,其右边窗口中就显示了所有DLL文件及其相关数据,其中数据右边小括号内的数字就说明了被几个程序使用,(2)表示被两个程序使用,(0)则表示无程序使用,可将其删除。

3、如何解决DLL文件丢失的情况
有时在卸载文件时会提醒你删除某个DLL文件可能会影响其他应用程序的运行。所以当你卸载软件时,就有可能误删共享的DLL文件。一旦出现丢失DLL文件的情况,如果你能确定其名称,可以在Sysbckup(系统备份文件夹)中找到该DLL文件,将其复制到System文件夹中。如果不行,在电脑启动时又总是出现“***dll文件丢失……”的提示框,你可以在“开始/运行”中运行Msconfig,进入系统配置实用程序对话框以后,单击选择“System.ini”标签,找出提示丢失的DLL文件,使其不被选中,这样开机时就不会出现错误提示。

目录
相关文章
|
2月前
|
Windows
DLL介绍
DLL介绍
128 0
DLL介绍
|
7月前
|
开发框架 .NET C#
JsonRequestBehavior不存在问题,JsonRequestBehavior属于哪个dll
JsonRequestBehavior不存在问题,JsonRequestBehavior属于哪个dll
|
程序员 开发工具 C语言
|
安全 API 网络安全
|
Web App开发 安全
|
C++
C++ DLL导出类 知识大全
在公司使用C++ 做开发,公司的大拿搭了一个C++的跨平台开发框架。在C++开发领域我还是个新手,有很多知识要学,比如Dll库的开发。    参考了很多这方面的资料,对DLL有一个基本全面的了解。有一个问题让我有点困惑,普通的导入导出C++类的方式都是使用_declspec(dllexport) /_declspec(dllimport)来导入导出类,但是在公司的开发中我们没有导入导出,而是定义了一些只有纯虚函数的抽象类,然后定义了一个工厂类,将这个工厂类注册到框架的服务中心中,使用时从服务中心拿到这个工厂类,就可以创建Dll中的其它类。
1618 0