以前的時候寫過這方面的部落格,當時寫的時候都覺得已經懂了。今天閒著沒事幹,和咚哥他們去大華校招筆試遇到了這個問題。我突然間發現sdk沒寫三個月,把dll都忘記了。回來看了下,複習下。
以前寫過程式的裝載和鏈結的部落格,那是os上面比較理論的。實際用函式庫的時候主要分為,靜態庫和動態庫,這裡就簡簡單單地介紹下了。
靜態庫(static libary)就是平時的 .lib 檔案,靜態庫裡面包含的是所有的**和資料,是完整的!程式在編譯生成.obj檔案後,聯結器將.obj檔案和.lib檔案整合到.exe裡面,程式執行時候所需的函式**和資料都已經在.exe中了,靜態庫很霸道,不管你願不願意,它就一股腦兒把所有需要的東西都給你,所以就沒有匯出函式這個概念,缺點就是整合出來的產品比較大,而且很不利於下次的公升級,每次公升級都得把lib檔案修改,然後重新編譯鏈結整合出來新的程式,而且靜態鏈結庫不能包含其他的鏈結庫,這一點和動態鏈結庫有很大的區別。
使用方式:
在生成的.h檔案中做如下宣告
extern 「c」 function()……
在呼叫函式的.cpp檔案裡面
#include 「***.h」
#pragma comment(lib,」***.lib」)
動態鏈結庫是在執行的時候動態載入的,可以人為也可以非人為,看你怎麼用,總之就是很靈活。下面直接說呼叫方式。
1.隱式載入
隱式載入把你的動態鏈結庫的**生成.lib檔案+.dll,隱式載入的時候需要的就是.h,.dll,.lib檔案。說的簡單點,.dll檔案裡面是函式的定義和資料,只是一部分,那麼宣告呢?宣告就在.lib,.lib檔案就包含了.dll檔案中函式的宣告和一些其他的資料。奇怪了,為什麼上面的靜態鏈結庫裡面的.lib檔案不是涵蓋了所有的函式資訊嗎?我以前百思不得其解,查了下網上的資料,此.lib非彼.lib。若是編譯鏈結你的dll至少輸出乙個函式的話,.lib檔案就當作一種引導函式的輸出表來用了,裡面包含了函式的「宣告」。在隱式載入裡面的.lib檔案編譯鏈結的時候整合到程式裡面,但是dll裡面的**和資料卻沒有整合進去,讓exe檔案所佔空間更小。但是引導程式載入exe,dll就被載入到記憶體中了,引導程式先為新的程序建立乙個虛擬位址空間,並將可執行模組對映到新程序的位址空間中。引導程式接著解析可執行模組的匯入段。對匯入段中列出的每個dll,引導程式會在使用者的系統中對該dll模組進行定位(差不多就是和lib中進行核實),並將該dll對映到程序的位址空間中。注意,由於dll模組可以從其它dll模組中匯入函式和變數,因此dll模組可能有自己的匯入段並需要將它所需的dll模組對映到程序的位址空間中。
詳細參考
隱式載入使用方式:
#include 「***.h」
#pragma comment(lib,***.lib)
並把dll放到環境變數或者執行目錄下
2.顯示載入
採用loadlibrary,freelibrary來手動載入,這種載入是在程式執行的時候載入所需要的dll,和隱式鏈結不一樣,顯示載入隨時可以在需要的時候載入指定的dll模組,也可以隨時解除安裝。而隱式載入實際上存在乙個dll計數器,當計數器為0的時候系統就自動幫你解除安裝了。函式會在使用者的系統中對dll的檔案映像進行定位,並試圖將該檔案映像對映到呼叫程序的位址空間中。loadlibrary返回的hmodule表示檔案映像被映 射到的虛擬記憶體位址。
顯示載入使用方式:
只需要dll即可
詳細參考
靜態鏈結庫和動態鏈結庫
其實再vc中,我們所用得所有api函式都封裝再下列三個dll檔案中 kernel32.dll 用於管理記憶體,程序和執行緒得各個函式 user32.dll 用於執行使用者介面任務,如視窗的建立和訊息的傳遞的各個函式 gdi32.dll 用於顯示文字和畫圖的各個函式 動態鏈結庫 我們再使用動態庫的時候...
靜態鏈結庫和動態鏈結庫
靜態鏈結庫 win32 static library 呼叫libtest.lib 動態dll win32 dynamic link library 跟librest的生成是一樣的 動態呼叫 成的.lib 和.dll 檔案拷入dllcall 工程所在的路徑,dllcall 執行下列 dll 中匯出函式...
靜態鏈結庫和動態鏈結庫
什麼是庫?庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib...