9
Implicit Linking Implicit Linking Expl Expl icit Linking icit Linking 4.17 4.17 與與與 與與與

Implicit Linking 與 Explicit Linking

Embed Size (px)

DESCRIPTION

Implicit Linking 與 Explicit Linking. 4.17 王俊富. Implicit Linking( 隱式聯結 ). - PowerPoint PPT Presentation

Citation preview

Page 1: Implicit Linking 與 Explicit Linking

Implicit LinkingImplicit Linking 與與 Explicit LinExplicit Linking king

4.17 4.17 王俊富王俊富

Page 2: Implicit Linking 與 Explicit Linking

Implicit Linking(Implicit Linking( 隱式聯結隱式聯結 ))

Implicitly LinkImplicitly Link (隱式聯結)又稱靜態載入,所謂(隱式聯結)又稱靜態載入,所謂靜態載入是指程式在聯結時期即與靜態載入是指程式在聯結時期即與 DLLsDLLs 所對應所對應的的 import librariesimport libraries 做靜態鏈結,於是可執行檔中做靜態鏈結,於是可執行檔中便對所有的便對所有的 DLLDLL 函式都有一份重定位表格函式都有一份重定位表格 (reloca(relocation table)tion table) 和待修正記錄和待修正記錄 (fixup record)(fixup record) 。當程式。當程式被被 Windows Windows 載入器載入記憶體中,載入器會自載入器載入記憶體中,載入器會自動修正所有的動修正所有的 fixup recordsfixup records ,而這個,而這個 fixup recorfixup records ds 就是記錄由就是記錄由 DLLDLL 中所有輸出資源的正確位址,中所有輸出資源的正確位址,經過這樣的程序動態聯結便順利產生。也就是說,經過這樣的程序動態聯結便順利產生。也就是說,程式開始執行時,會用靜態載入方式所使用的程式開始執行時,會用靜態載入方式所使用的 DLDLLsLs 都載入到行程的記憶體裡。都載入到行程的記憶體裡。

Page 3: Implicit Linking 與 Explicit Linking

靜態載入方式的優點靜態載入方式的優點11 、靜態載入方式所使用到的這個、靜態載入方式所使用到的這個 DLLDLL 會在應用會在應用程式執行時載入,然後就可以呼叫出所有由程式執行時載入,然後就可以呼叫出所有由 DLLDLL中匯出的函式,就好像是包含在程式中一般。中匯出的函式,就好像是包含在程式中一般。

22 、動作較為簡單,載入的方法由編譯器負責處、動作較為簡單,載入的方法由編譯器負責處理,不須動腦筋。理,不須動腦筋。

Page 4: Implicit Linking 與 Explicit Linking

靜態載入方式的缺點靜態載入方式的缺點 11 、當這個程式靜態載入方式所使用到的這個、當這個程式靜態載入方式所使用到的這個 DLDLLL 不存在時,這個程式在開始時就出現無法找到不存在時,這個程式在開始時就出現無法找到DLLDLL 的訊息而導致應用程式無法執行。 的訊息而導致應用程式無法執行。 22 、編譯時需要加入額外的、編譯時需要加入額外的 import libraryimport library 。。33 、若是要載入的、若是要載入的 DLLsDLLs 一多,載入應用程式的速一多,載入應用程式的速度會變慢。度會變慢。44 、若遇到不同品牌的、若遇到不同品牌的 C++C++ 編譯器時,靜態載入編譯器時,靜態載入可就沒這麼簡單處理了,因為當函式經過可就沒這麼簡單處理了,因為當函式經過 Calling Calling ConventionsConventions 的處理後,若要使用其他品牌編譯的處理後,若要使用其他品牌編譯器所製造出的器所製造出的 DLLDLL 須得大動干戈才行。須得大動干戈才行。

Page 5: Implicit Linking 與 Explicit Linking

Explicit Linking Explicit Linking

所謂所謂 Explicitly linkExplicitly link (顯式聯結)又稱動態載入,(顯式聯結)又稱動態載入,使用 使用 DLL DLL 的可執行檔必須製作動態載入和卸載 的可執行檔必須製作動態載入和卸載 DLL DLL 的函式呼叫 的函式呼叫 (Function Call)(Function Call) ,並且存取 ,並且存取 DDLL LL 的匯出函式。用戶端可執行檔必須經由函式指的匯出函式。用戶端可執行檔必須經由函式指標呼叫匯出函式。 標呼叫匯出函式。 可執行檔可以使用具任何一種連結方式的相同 可執行檔可以使用具任何一種連結方式的相同 DDLLLL 。再者,這些機制之間並不會互相排斥,因此。再者,這些機制之間並不會互相排斥,因此當一個可執行檔隱式地連結至 當一個可執行檔隱式地連結至 DLL DLL 時,另一個時,另一個可執行檔可以顯式地連結至它。 可執行檔可以顯式地連結至它。

Page 6: Implicit Linking 與 Explicit Linking

動態載入方式的優缺點動態載入方式的優缺點11 、、 DLLDLL 只有需要時才會載入到記憶體中,只有需要時才會載入到記憶體中,可以更有效的使用記憶體。可以更有效的使用記憶體。22 、應用程式載入的速度較使用隱式鏈結時、應用程式載入的速度較使用隱式鏈結時快,因為當程式開始載入時並不需要把快,因為當程式開始載入時並不需要把 DLDLLL 給載入到行程中。給載入到行程中。33 、編譯時不須額外的、編譯時不須額外的 import libraryimport library 檔。檔。44 、讓我們可以更清楚、讓我們可以更清楚 DLLDLL 的載入流程。的載入流程。缺點就是必須寫多一點程式碼。 缺點就是必須寫多一點程式碼。

Page 7: Implicit Linking 與 Explicit Linking

動態載入基本流程動態載入基本流程必須使用必須使用 LoadLibraryLoadLibrary 這個這個 Windows APIWindows API來手動載入來手動載入 DLLDLL ,並使用,並使用 GetProcessAddrGetProcessAddress ess 來取得所要使用的函式的函式指標,來取得所要使用的函式的函式指標,最後不需要用到此最後不需要用到此 DLLDLL 時使用時使用 FreeLibraryFreeLibrary將將 DLL DLL 釋放。所以,在學會動態載入釋放。所以,在學會動態載入 DLLDLL時,必須先知道函式指標的用法。 時,必須先知道函式指標的用法。

Page 8: Implicit Linking 與 Explicit Linking

動態載入範例動態載入範例http://www2.borland.com.tw/tw/td001018.hhttp://www2.borland.com.tw/tw/td001018.htmltml

Page 9: Implicit Linking 與 Explicit Linking

參考資料參考資料探訪動態連結函式庫探訪動態連結函式庫http://www2.borland.com.tw/tw/td001018.htmlhttp://www2.borland.com.tw/tw/td001018.htmldlldll 小小紀錄小小紀錄http://kevin.iecs.us/2006/11/08/http://kevin.iecs.us/2006/11/08/DLLDLL 應用應用

http://sun.cis.scu.edu.tw/~nms9115/articles/delphttp://sun.cis.scu.edu.tw/~nms9115/articles/delphi/PluginDLL/PluginDLL.htmhi/PluginDLL/PluginDLL.htm使用使用 DLLDLL 的優點 的優點

http://msdn2.microsoft.com/zh-tw/library/dtba4t8http://msdn2.microsoft.com/zh-tw/library/dtba4t8b(VS.80).aspxb(VS.80).aspx