Windows 在处理 dll 的一些容易被人忽略的细节
2008-02-28 09:40
369 查看
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 换名的效果。
关于 COM 对象 DLL 存放在本地目录的问题
已经注册的 COM 对象,如果害怕跟别的软件冲突,就可以用 DLL 转移技术。不过这个 Windows 98 中是不支持的。
比如 myapp.exe 想强制优先加载当前目录下的 DLL ,那么只要创建一个文件名叫作 myapp.exe.local ,启动 myapp.exe 后, DLL 都将优先从当前目录加载了。
中,用注册表编辑器,我们可以看到这个别名的列表。
比如有一条数据是 kernel32 / kernel32.dll 这条记录保证了再调用 LoadLibrary("kernel32.dll") 的时候,系统总是调用的 system32 下的 kernel32.dll 这个版本。而不会是当前目录下的 kernel32.dll (如果有的话)
这是如何做到的呢?
LoadLibrary 发现参数字符串中需要加载的是 kernel32.dll (没有显式指定路径) 的话,就会在注册表中找到 DllDirectory 这一项,再那个指定路径下加载 kernel32.dll 。
注意,这里的键名是没有 .dll 的后缀的。系统在识别 dll 是否属于 KnownDLLs 的时候,只能对需要加载的后缀为 .dll 的文件起效,在匹配键名的时候再截断后缀。
我们也可以通过修改注册表,达到给这些系统的 DLL 换名的效果。
关于 COM 对象 DLL 存放在本地目录的问题
已经注册的 COM 对象,如果害怕跟别的软件冲突,就可以用 DLL 转移技术。不过这个 Windows 98 中是不支持的。
比如 myapp.exe 想强制优先加载当前目录下的 DLL ,那么只要创建一个文件名叫作 myapp.exe.local ,启动 myapp.exe 后, DLL 都将优先从当前目录加载了。
相关文章推荐
- html5一些容易忽略的细节
- js一些容易忽略的细节
- Windows 对 DLL 文件的一些处理
- C++中容易忽略的一些细节
- MS Server和Oracle中对NULL处理的一些细节差异
- 【C/C++】C语言中一些容易被人忽略的东西 之六 【文件读写,y上两点】
- 关于windows中一些系统dll的卸载套路
- 一些简单容易弄错的java继承小细节
- [转载]大型项目管理的容易忽略的一些问题
- Android面面观——Android事件处理下(按键、触摸屏和滚动球的一些实现细节)
- html容易被忽略的一些表单属性的用法
- iOS中容易忽略的小细节
- 新手在sae部署程序容易忽略的一个细节
- c 中 stdout, stderr 容易忽视的一些细节
- 看了,容易被忽略的细节(1):config文件的使用 ,我也谈谈这个简单的问题
- Linux定义信号的一些细节处理
- (转)CS0016: 未能写入输出文件“c:\WINDOWS\xxxxxsktsuj.dll”--“拒绝访问。”的处理
- 一些日常忽略的细节程序设置
- C语言中一些容易忽视的细节
- Android init进程一些容易忽视的技术细节