« Windows 下的进程间通讯及数据共享 | 返回首页 | lua 的 table 处理 »

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

比如有一条数据是 kernel32 / kernel32.dll 这条记录保证了再调用 LoadLibrary("kernel32.dll") 的时候,系统总是调用的 system32 下的 kernel32.dll 这个版本。而不会是当前目录下的 kernel32.dll (如果有的话)

首先会检查进程内是否已经加载了Kernel32.dll,如果已加载,那么会使用这个,如果没有加载过,那么会在KnowDlls里查找;
参考:https://msdn.microsoft.com/en-us/library/windows/desktop/ms682586(v=vs.85).aspx#factors_that_affect_searching

从核心编程里看到过类似的说法

不清楚手动注册的com对象有没有这样的路径.

没注意过,思路又清楚点了.

不错不错。学了一招

谢谢了

Post a comment

非这个主题相关的留言请到:留言本