您的位置:首页 > 其它

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 都将优先从当前目录加载了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: