1. 首先,我用VS2010創建了一個Dll工程。
編譯連接後,便在Debug目錄下得到了.lib,.dll文件。
2. 然後,我再創建了一個win32控制檯程序,使用這個dll文件,我使用的方式是裝載時調用,所以我需要.h,.lib,.dll文件。
2.1 我將這3個文件複製到這個程序的目錄下,然後在程序中就可以直接使用了。
2.2 在運行的過程中,我發現運行時,使用的dll文件不是當前程序目錄下我複製過來的dll文件,而是利用原來Dll工程中Debug下的dll文件。
2.3 然後,我將原創建dll工程下Debug目錄下的dll文件刪除掉後,再執行一下這個控制檯程序,發現此時調用的dll就是我複製到這個程序目錄下的dll文件了。
所以我猜測lib文件中應該有記錄原創建dll的目錄信息,所以在使用lib的時候,程序會從lib文件中記錄的dll路徑去找dll來加載,從而執行;而當發現這個記錄路徑下沒有預想的dll文件後,系統就會從程序當前路徑找相應的dll,於是就找到了我們複製過來的dll文件,於是程序便可以執行了。
lib文件中記錄有原dll文件信息有一個好處,那就是隻要我不改變庫文件接口,而是更新原接口的操作,這樣重新編譯生成新的dll文件,這樣就不需要每次更新庫接口操作後,都要將新的.lib和.dll文件複製到需要使用的地方,這樣就很方便。當然這只是在本機調試時比較方便,如果已經發布了dll,那麼每次更新dll,都要給用戶發佈這個新的dll文件。如果dll文件中增加了新的接口函數或改變了接口名稱,那麼就要利用新的.h文件和.lib文件,重新構建生成應用程序,然後將這個“升級版的”應用程序和新的dll發佈給用戶,進行更新。
相關問題:
一. 程序執行時,系統裝在dll文件的路徑順序?lib文件記錄路徑——>程序當前路徑——>??
參考地址:http://msdn.microsoft.com/zh-cn/library/7d83bc18(VS.80).aspx
通過隱式和顯式鏈接,Windows 首先搜索“已知 DLL”,如 Kernel32.dll 和 User32.dll。Windows 然後按下列順序搜索 DLL:
1. 當前進程的可執行模塊所在的目錄。
2. 當前目錄。
3. Windows 系統目錄。GetSystemDirectory 函數檢索此目錄的路徑。
4. Windows 目錄。GetWindowsDirectory 函數檢索此目錄的路徑。
5. PATH 環境變量中列出的目錄。
二. 用dll構建程序時,如何處理dll更新升級問題?這個問題比較大、複雜,以後用的時候,慢慢總結吧。