Windows 用来定位 DLL 的搜索路径
《程序員面試寶典》一書中寫到,windows搜索dll文件的順序?yàn)?span style="color:#6633ff">:(1)內(nèi)存(2)knowndlls(3)清單與.local(4)應(yīng)用程序目錄(5)當(dāng)前工作目錄(6)系統(tǒng)目錄(7)路徑變量
總覺(jué)得不太明白,遂查資料確認(rèn)一下。
查msdn如下:http://msdn.microsoft.com/zh-cn/library/7d83bc18.aspx
通過(guò)隱式和顯式鏈接,Windows 首先搜索“已知 DLL”,如 Kernel32.dll 和 User32.dll。Windows 然后按下列順序搜索 DLL:
當(dāng)前進(jìn)程的可執(zhí)行模塊所在的目錄。
當(dāng)前目錄。
Windows 系統(tǒng)目錄。GetSystemDirectory 函數(shù)檢索此目錄的路徑。
Windows 目錄。GetWindowsDirectory 函數(shù)檢索此目錄的路徑。
PATH 環(huán)境變量中列出的目錄。
隱式鏈接有時(shí)稱為靜態(tài)加載或加載時(shí)動(dòng)態(tài)鏈接。顯式鏈接有時(shí)稱為動(dòng)態(tài)加載或運(yùn)行時(shí)動(dòng)態(tài)鏈接。
在隱式鏈接下,使用 DLL 的可執(zhí)行文件鏈接到該 DLL 的創(chuàng)建者所提供的導(dǎo)入庫(kù)(.lib 文件)。使用 DLL 的可執(zhí)行文件加載時(shí),操作系統(tǒng)加載此 DLL。客戶端可執(zhí)行文件調(diào)用 DLL 的導(dǎo)出函數(shù),就好像這些函數(shù)包含在可執(zhí)行文件內(nèi)一樣。
在顯式鏈接下,使用 DLL 的可執(zhí)行文件必須進(jìn)行函數(shù)調(diào)用以顯式加載和卸載該 DLL,并訪問(wèn)該 DLL 的導(dǎo)出函數(shù)。客戶端可執(zhí)行文件必須通過(guò)函數(shù)指針調(diào)用導(dǎo)出函數(shù)。
“已知的 DLL”(非正式名稱)的功能指由內(nèi)核的模塊加載器進(jìn)行特殊處理的 DLL(動(dòng)態(tài)鏈接庫(kù))列表。當(dāng)加載器發(fā)現(xiàn)具有指向已知的 DLL 的加載時(shí)動(dòng)態(tài)鏈接的程序時(shí),就會(huì)立即使用已知的副本,而忽略通常情況下應(yīng)用于模塊加載的搜索算法。
那上面所寫的內(nèi)存是什么道理呢?搜索動(dòng)態(tài)庫(kù)首先是內(nèi)存,如果內(nèi)存中存在就不需要加載,否則需要搜索到后加載到內(nèi)存中。dll的主要優(yōu)點(diǎn)也是節(jié)省內(nèi)存和減少交換操作。很多進(jìn)程可以同時(shí)使用一個(gè) DLL,在內(nèi)存中共享該 DLL 的一個(gè)副本。相反,對(duì)于每個(gè)用靜態(tài)鏈接庫(kù)生成的應(yīng)用程序,Windows 必須在內(nèi)存中加載庫(kù)代碼的一個(gè)副本。
感覺(jué).local文件像是配置之類的,沒(méi)查到相關(guān)資料,不清楚。
當(dāng)前工作目錄 (Current Working Directory), 一般來(lái)說(shuō),每個(gè)進(jìn)程都有一個(gè)與之相關(guān)聯(lián)的分級(jí)文件系統(tǒng)(hierarchical file system)下的目錄,稱之為該進(jìn)程的當(dāng)前工作目錄。如果程序剛進(jìn)入main入口處的時(shí)候,當(dāng)前工作目錄其實(shí)就是程序啟動(dòng)的目錄,但是當(dāng)前工作目錄是可以通過(guò)程序進(jìn)行設(shè)置或者隨著OpenFileDialog、SaveFileDialog等對(duì)象所確定的目錄而改變。
應(yīng)用程序所在的目錄, 該進(jìn)程從中啟動(dòng)的目錄,即程序文件自身所在的目錄。和當(dāng)前工作目錄是不同的。
總結(jié)
以上是生活随笔為你收集整理的Windows 用来定位 DLL 的搜索路径的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 将csv文件导入到mysql数据库
- 下一篇: 答答租车系统(面向对象综合练习)_JAV