windows核心程式設計 19

2021-06-22 15:46:46 字數 1901 閱讀 7110

dll能夠包含諸如對話方塊模板、字串、圖示以及位圖之類的資源。多個應用程式可以使用dll來共享這些資源。

在所有的原始檔編譯完成之後,鏈結器會像鏈結應用程式的可執行檔案那樣,對它們進行鏈結,但在建立dll的時候,我們必須給鏈結器指定/dll開關。這個開關會使鏈結器在生成的dll檔案映像中儲存一些與可執行檔案略微不同的資訊,這樣作業系統的引導程式就能夠將該檔案映像識別為dll,而不會將它識別為應用程式。

當乙個模組提供乙個記憶體分配函式的時候,它必須同時提供另乙個用來釋放記憶體的函式。

可執行模組包含乙個匯入段(importsection),其中列出了所有它需要的dll模組的名稱。此外,對列出的每個dll,該段還記錄了可執行檔案的二進位制**從中引用的函式和變數的符號名。

乙個dll可以匯出變數、函式或c++類來供其他模組使用。在實際開發中,我們應該避免從dll中匯出變數,因為這等於是去掉了**中的乙個抽象層,從而使得dll的**更加難以維護。此外,只有當匯出c++類的模組使用的編譯器與匯入c++類的模組使用的編譯器由同一家廠商提供時,我們才可以匯出c++類。因此,除非知道可執行模組的開發人員與dll模組的開發人員使用的是相同的工具包,否則我們應該避免從dll中匯出c++類。

mylib.h

#ifndef mylibapi

#define mylibapiextern 「c」 __declspec(dllimport)

#endif

mylibapi intadd(int a, int b);

mlib.cpp

#define mylibapiextern 「c」 __declspec(dllexport)

#include「mylib.h」

int add(int a,int b)

return a + b;

如果編譯器看到乙個變數、函式或c++類是用__declspec(dllexport)修飾的,那麼它就知道應該在生成的dll模組中匯出該變數、函式或c++類。

當使用__stdcall來匯出c函式的時候,microsoft的編譯器會對函式名進行改編,具體的方法是給函式名新增下劃線字首和乙個特殊的字尾,該字尾由乙個@符號後跟作為引數傳給函式的位元組數組成。為了匯出原名,需要建立.def檔案。

如果編譯器看到乙個變數、函式、或c++類是用__declspec(dllimport)來修飾的,那麼它會知道應該是從某個dll模組中匯入該符號。編譯器不知道,也不需要知道具體的dll模組是哪乙個。編譯器只想確認我們以正確的方式來訪問這些匯入符號。

接下來,為了建立可執行模組,鏈結器必須將所有的.obj模組合併到一起。由於鏈結器必須確定**中引用的匯入符號來自哪個dll,因此我們必須將dll的.lib檔案傳給鏈結器。正如我們前面已經提到過,.lib檔案只不過是列出了dll模組匯出的符號。鏈結器只想知道被引用的符號確實存在,以及該符號來自哪個dll模組。如果鏈結器能夠解決(resolve)對所有外部符號的引用,那麼它將生成可執行模組。

啟動乙個可執行模組的時候,作業系統的引導程式會先為程序建立虛擬位址空間,接著把可執行模組對映到程序的位址空間中。之後引導程式會檢查可執行模組的匯入段,試圖對所需的dll進行定位並將它們對映到程序的位址空間中。

由於引導程式會對載入的dll模組進行記錄,因此即使多個模組用到了同乙個模組,該模組也只會被載入和對映一次。

當引導程式將所有dll模組都載入並對映到程序的位址空間中後,它開始修復所有對匯入符號的引用。為了完成這一工作,它會再次檢視每個模組的匯入段。對匯入段中列出的每個符號,引導程式會檢查對應dll的匯出段,看該符號是否存在。如果該符號不存在(這種情況實屬罕見),那麼引導程式會出現錯誤提示框。如果該符號存在,那麼引導程式會取得該符號的rva並給它加上dll模組被載入到的虛擬位址(從而得到符號在程序的位址空間中的位置)。接著引導程式會將這個虛擬位址儲存到可執行模組的匯入段中。現在,當**引用到乙個匯入符號的時候,會檢視呼叫模組的匯入段並得到被匯入符號的位址,這樣就能夠成功地訪問被匯入的變數、函式或c++類成員函式了。

Windows核心程式設計

內容簡介 這是一本經典的windows核心程式設計指南,從第1版到第5版,引領著數十萬程式設計師走入windows開發陣營,培養了大批精英。作為windows開發人員的必備參考,本書是為打算理解windows的c和c 程式設計師精心設計的。第5版全面覆蓋windows xp,windows vist...

WINDOWS核心程式設計 核心物件

今天想把看的第三章的心得寫下來。這章主要介紹了核心物件。在windows中,核心物件是由作業系統來管理,儘管使用者能夠建立它,但是在建立之後,使用者對該核心物件的操作都是委託給作業系統。通常使用者建立和使用的物件分為 使用者物件 如 hicon createicon prama gdi物件函式以及核...

Windows核心程式設計 核心物件

每個核心物件只是核心分配的乙個記憶體塊,只能由核心訪問.該記憶體塊是一種資料結構,它的成員負責維護物件的各種資訊,由得物件型別相同,但大多數不同,比如程序物件有個程序id,乙個基本優先順序,乙個退出 檔案物件則有乙個位元組位移,乙個共享模式,乙個開啟模式 如果核心控制代碼傳遞給另外乙個程序,那麼這另...