Windows 对 DLL 文件的一些处理
Windows 的 DLL 文件是可以有别名的,它设置在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
中,用注册表编辑器,我们可以看到这个别名的列表。
比如有一条数据是 kernel32 / kernel32.dll 这条记录保证了再调用 LoadLibrary("kernel32.dll") 的时候,系统总是调用的 system32 下的 kernel32.dll 这个版本。而不会是当前目录下的 kernel32.dll (如果有的话)
这是如何做到的呢?
LoadLibrary 发现参数字符串中需要加载的是 kernel32.dll (没有显式指定路径) 的话,就会在注册表中找到 DllDirectory 这一项,再那个指定路径下加载 kernel32.dll 。
注意,这里的键名是没有 .dll 的后缀的。系统在识别 dll 是否属于 KnownDLLs 的时候,只能对需要加载的后缀为 .dll 的文件起效,在匹配键名的时候再截断后缀。
我们也可以通过修改注册表,达到给这些系统的 DLL 换名的效果。
<strong>关于 COM 对象 DLL 存放在本地目录的问题</strong>
已经注册的 COM 对象,如果害怕跟别的软件冲突,就可以用 DLL 转移技术。不过这个 Windows 98 中是不支持的。
比如 myapp.exe 想强制优先加载当前目录下的 DLL ,那么只要创建一个文件名叫作 myapp.exe.local ,启动 myapp.exe 后, DLL 都将优先从当前目录加载了。
Comments
Posted by: Coder Li | (5) August 20, 2015 02:25 PM
Posted by: yangg025 | (4) August 4, 2006 02:09 PM
Posted by: ALL开拓者 | (3) February 20, 2006 01:13 PM
Posted by: ALL开拓者 | (2) February 20, 2006 01:11 PM
Posted by: sandy | (1) October 28, 2005 10:09 AM