dll文件的作用!?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dll文件的作用!?相关的知识,希望对你有一定的参考价值。
dll文件的作用是什么呢?dll文件为API提供的就是一个接口函数吗?复制黏贴的不会给分的...希望是个人的见解..thank。
DLL文件(Dynamic Linkable Library 即动态链接库文件),是一种不能单独运行的文件,它允许程序共享执行特殊任务所必需的代码和其他资源比较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。可能存在一些模块的功能较为通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序 EXE 文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的 EXE 程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试。
Windows 系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的 DLL 文件,并可对它们单独编译和测试。在运行时,只有当 EXE 程序确实要调用这些 DLL 模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了 EXE 文件的大小和对内存空间的需求,而且使这些 DLL 模块可以同时被多个应用程序使用。Windows 自己就将一些主要的系统功能以 DLL 模块的形式实现。
一般来说,DLL 是一种磁盘文件,以.dll、.DRV、.FON、.SYS 和许多以 .EXE 为扩展名的系统文件都可以是 DLL。它由全局数据、服务函数和资源组成,在运行时被系统加载到调用进程的虚拟空间中,成为调用进程的一部分。如果与其它 DLL 之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL 模块中包含各种导出函数,用于向外界提供服务。DLL 可以有自己的数据段,但没有自己的堆栈,使用与调用它的应用程序相同的堆栈模式;一个 DLL 在内存中只有一个实例;DLL 实现了代码封装性;DLL 的编制与具体的编程语言及编译器无关。
在 Win32 环境中,每个进程都复制了自己的读/写全局变量。如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL 模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。Windows 在加载 DLL 模块时将进程函数调用与 DLL 文件的导出函数相匹配。Windows 操作系统对 DLL 的操作仅仅是把 DLL 映射到需要它的进程的虚拟地址空间里去。DLL 函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。
调用方式:
1、静态调用方式:由编译系统完成对 DLL 的加载和应用程序结束时 DLL 卸载的编码(如还有其它程序使用该 DLL,则 Windows 对 DLL 的应用记录减1,直到所有相关程序都结束对该 DLL 的使用时才释放它,简单实用,但不够灵活,只能满足一般要求。
隐式的调用:需要把产生动态连接库时产生的 .LIB 文件加入到应用程序的工程中,想使用 DLL 中的函数时,只须说明一下。隐式调用不需要调用 LoadLibrary() 和 FreeLibrary()。程序员在建立一个 DLL 文件时,链接程序会自动生成一个与之对应的 LIB 导入文件。该文件包含了每一个 DLL 导出函数的符号名和可选的标识号,但是并不含有实际的代码。LIB 文件作为 DLL 的替代文件被编译到应用程序项目中。
当程序员通过静态链接方式编译生成应用程序时,应用程序中的调用函数与 LIB 文件中导出符号相匹配,这些符号或标识号进入到生成的 EXE 文件中。LIB 文件中也包含了对应的 DL L文件名(但不是完全的路径名),链接程序将其存储在 EXE 文件内部。
2、动态调用方式:是由编程者用 API 函数加载和卸载 DLL 来达到调用 DLL 的目的,使用上较复杂,但能更加有效地使用内存,是编制大型应用程序时的重要方式。
显式的调用:
是指在应用程序中用 LoadLibrary 或 MFC 提供的 AfxLoadLibrary 显式的将自己所做的动态连接库调进来,动态连接库的文件名即是上面两个函数的参数,再用 GetProcAddress() 获取想要引入的函数。自此,你就可以象使用如同本应用程序自定义的函数一样来调用此引入函数了。
正因为DLL 有占用内存小,好编辑等的特点有很多电脑病毒都是DLL格式文件。但不能单独运行。
动态链接库通常都不能直接运行,也不能接收消息。它们是一些独立的文件,其中包含能被可执行程序或其它DLL调用来完成某项工作的函数。只有在其它模块调用动态链接库中的函数时,它才发挥作用。 参考技术A DLL的全称是Dynamic Link Library, 中文叫做"动态链接文件"
在Windows操作系统中, DLL对于程序执行是非常重要的, 因为程序在执行的时候, 必须链接到DLL文件, 才能够正确地运行。
但是当安装的程序越来越多, DLL文件也就会越来越多, 如果当你删除程序的时候, 没有用的DLL文件没有被删除的话, 久而久之就造成系统的负担了。 参考技术B 楼主说的是一个方面, 其实软件中DLL作用很简单, 通俗点说就是模块的非模态调用, 楼主别认为这个是复制的, 意思就是, 需要某个函数或者需要实现某个功能的时候, 才开始调用DLL, 调用结束后释放, 这个是非模态, 和EXE比较好处是实时调用.EXE是启动时全部加载, 而DLL是使用时加载, 不使用不加载, 这样软件运行起来速度也很快.如果楼主学的深入一点就知道, 我做过外挂, 外挂有个技术是线程式插入, 就是把DLL插入游戏的进程里面从而可以方便使用游戏的数据, 这个插入EXE就做不到, 而DLL很简单就可以做到. OK了. 参考技术C 很高兴为您解答:
(Dynamic Link
Library或者Dynamic-link library,缩写为DLL),是微软公司在微软视窗操作系统中实现共享函数库概念的一种实作方式。DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。这些库函数的扩展名是.DLL、OCX(包含ActiveX控制的库)或者.DRV(旧式的系统驱动程序)。函数的可执行代码位于一个DLL
中,该DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个DLL
副本的内容。DLL 是一个包含可由多个程序同时使用的代码和数据的库。
如果你电脑缺少了这个文件,你可以使用腾讯电脑管家的电脑诊所修复
祝楼主工作顺利、生活愉快!! 参考技术D 系统文件
php_redis.dll 在 Windows 中不起作用
【中文标题】php_redis.dll 在 Windows 中不起作用【英文标题】:php_redis.dll not working in windows 【发布时间】:2012-06-13 18:47:19 【问题描述】:我从这里尝试了这两个文件:https://github.com/nicolasff/phpredis/downloads。我在 Windows 7 Professional 上使用 64 位 wampserver。看起来 apache 正在尝试加载文件,但不知何故无法正确识别它。这是我在错误日志中看到的:
PHP 启动:无法加载动态库 'D:/wamp/bin/php/php5.3.13/ext/php_redis.dll' - %1 无效 Win32 应用程序。
有人遇到过类似的问题吗?我们对此有有效的解决方案吗?
【问题讨论】:
将extension_dir
的值放入您的php.ini
。它应该类似于C:\xampp\php\ext
@ZiTAL 我尝试了这两个 DLL。你有工作 dll 的链接吗?
我希望这对你有用***.com/questions/2001075/…
我不是在寻找像 predis 这样的 php 库。我想让扩展工作——特别是速度和 session.save_path=redis。
路径是否正确,D:/wamp/bin/php/php5.3.13/ext/php_redis.dll
?我想知道正斜杠是否应该改为反斜杠 (),但如果这与 Apache 的 .conf 文件中的布局一致,那么这可能无关紧要。
【参考方案1】:
不幸的是,我没有运行 64 位版本的 PHP 来测试这一点,但对于 PHP 5.3,您可以尝试this dll。
来自https://github.com/nicolasff/phpredis/downloads ( php_redis-2.1.3-5.2-vc6-ts-4350b2a.zip ) 的 Dll 在 PHP 5.2.17 (32 位版本) 上运行良好。 p>
希望你能解决问题。
【讨论】:
【参考方案2】:我会将答案添加到表格中:
我在 Windows 8 和 PHP 5.5 下将这些 dll 用于我的 AMPPS 服务器(WAMP 应该相同): https://pecl.php.net/package/redis/2.2.7/windows
按照本教程进行操作
https://www.linkedin.com/pulse/using-redis-windows-php-shekhar-joshi
【讨论】:
【参考方案3】:我在使用 PHP5.5.12 的 64 位 windows 7 wampserver 上遇到了同样的问题 并从 Redis 的下面链接 dll 二进制文件为我工作
http://windows.php.net/downloads/pecl/releases/redis/2.2.7/
【讨论】:
【参考方案4】:我有同样的情况,我正在安装 wamp 32bit,但是我以 64bit 导入了库,但是我不得不 imorted 32bit 版本。
在任务管理器中查看你使用的是哪个版本的 wamp!
【讨论】:
【参考方案5】:以防万一它可以帮助某人,我设法解决了 PHP 7.1.12 安装 32 位 DLL 的错误。
我收到了错误:
Warning: PHP Startup: Unable to load dynamic library '.../php_redis.dll'
not a valid Win32 application
但安装32位版本后,警告消失了。
要知道您使用的是哪种 XAMPP/WAMP 架构,请访问 phpinfo() 并查找值“Architecture”,它在第四行对我来说,并且正如预期的那样具有值 x86。
【讨论】:
【参考方案6】:我必须检查 phpinfo()
中的 Server API
来决定使用哪个版本
如果是 Apache 2.0 Handler(mod_php) 使用 Thread Safe 版本
如果是 CGI,请使用 非线程安全 版本
【讨论】:
【参考方案7】:我使用了 XAMPP x86 / PHP 7.2.5
所以我需要 redis x86 并且目录是这样的:C:/xampp/php/ext/
。
https://pecl.php.net/package/redis/4.1.0/windows
【讨论】:
【参考方案8】:对我来说,原因是我使用的 Redis PHP extension
版本。
最后对我有用的Redis PHP extension
版本是:
php_redis-5.3.4-7.4-ts-vc15-x64
我从这个Link下载的
【讨论】:
以上是关于dll文件的作用!?的主要内容,如果未能解决你的问题,请参考以下文章