靜態鏈結庫
win32 static library
呼叫libtest.lib:
動態dll
win32 dynamic-link library
**跟librest的生成是一樣的
動態呼叫:
成的.lib 和.dll 檔案拷入dllcall 工程所在的路徑,dllcall 執行下列**:
dll 中匯出函式的宣告有兩種方式:一種為在函式宣告中加上__declspec(dllexport),這裡不再舉例說明;另外一種方式是採用模組定義(.def)檔案宣告,.def 檔案為鏈結器提供了有關被鏈結程式的匯出、屬性及其他方面的資訊。
下面的**演示了怎樣同.def 檔案將函式add 宣告為dll 匯出函式(需在dlltest 工程
中新增lib.def 檔案):
; lib.def : 匯出dll 函式
library dlltest
exports
add @ 1
.def 檔案的規則為:
(1)library 語句說明.def 檔案相應的dll;
(2)exports 語句後列出要匯出函式的名稱。可以在.def 檔案中的匯出函式名後加@n,
表示要匯出函式的序號為n (在進行函式呼叫時,這個序號將發揮其作用);
(3).def 檔案中的注釋由每個注釋行開始處的分號 (;) 指定,且注釋不能與語句共享一
行。 由此可以看出,例子中lib.def 檔案的含義為生成名為「dlltest」的動態鏈結庫,匯出其
中的add 函式,並指定add 函式的序號為1。
帶dllmain的dll:
windows 在載入dll 的時候,需要乙個入口函式,就如同控制台或dos 程式需要main
函式、win32 程式需要winmain 函式一樣。在前面的例子中,dll 並沒有提供dllmain 函
數,應用工程也能成功引用dll,這是因為windows 在找不到dllmain 的時候,系統會從
其它執行庫中引入乙個不做任何操作的預設dllmain 函式版本,並不意味著dll 可以放棄
dllmain 函式。
根據編寫規範,windows 必須查詢並執行dll 裡的dllmain 函式作為載入dll 的依據,
它使得dll 得以保留在記憶體裡。這個函式並不屬於匯出函式,而是dll 的內部函式。這意
味著不能直接在應用工程中引用dllmain 函式,dllmain 是自動被呼叫的。
呼叫就跟其他dll呼叫是一樣的!
如果通過vc++編寫的dll 欲被其他語言編寫的程式呼叫,應將函式的呼叫方式宣告
為__stdcall 方式,winapi 都採用這種方式,而c/c++預設的呼叫方式卻為__cdecl 。__stdcall
方式與__cdecl 對函式名最終生成符號的方式不同。若採用c 編譯方式(在c++中需將函式聲
明為extern "c"),__stdcall 呼叫約定在輸出函式名前面加下劃線,後面加「@」符號和引數
的位元組數,形如_functionname@number ;而__cdecl 呼叫約定僅在輸出函式名前面加下劃線,
形如_functionname 。
windows 程式設計中常見的幾種函式型別宣告巨集都是與__stdcall 和__cdecl 有關的(節選自
windef.h ):
#define callback __stdcall //這就是傳說中的**函式
#define winapi __stdcall //這就是傳說中的winapi
#define winapiv __cdecl
#define apientry winapi //dllmain 的入口就在這裡
#define apiprivate __stdcall
#define pascal __stdcall
在lib.h 中,應這樣宣告add 函式:
int __stdcall add(int x, int y);
在應用工程中函式指標型別應定義為:
typedef int(__stdcall *lpaddfun)(int, int);
若在 lib.h 中將函式宣告為__stdcall 呼叫,而應用工程中仍使用 typedef int (*
lpaddfun)(int,int),執行時將發生錯誤(因為型別不匹配,在應用工程中仍然是預設的__cdecl
呼叫),彈出錯誤對話方塊。
靜態鏈結庫和動態鏈結庫
其實再vc中,我們所用得所有api函式都封裝再下列三個dll檔案中 kernel32.dll 用於管理記憶體,程序和執行緒得各個函式 user32.dll 用於執行使用者介面任務,如視窗的建立和訊息的傳遞的各個函式 gdi32.dll 用於顯示文字和畫圖的各個函式 動態鏈結庫 我們再使用動態庫的時候...
靜態鏈結庫和動態鏈結庫
以前的時候寫過這方面的部落格,當時寫的時候都覺得已經懂了。今天閒著沒事幹,和咚哥他們去大華校招筆試遇到了這個問題。我突然間發現sdk沒寫三個月,把dll都忘記了。回來看了下,複習下。以前寫過程式的裝載和鏈結的部落格,那是os上面比較理論的。實際用函式庫的時候主要分為,靜態庫和動態庫,這裡就簡簡單單地...
靜態鏈結庫和動態鏈結庫
什麼是庫?庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib...