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 都將優先從當前目錄加載了。