Windows核心编程 第十九章 DLL基础
第1?9章?D?L?L基礎(chǔ)
????這章是介紹基本dll,我就記錄一些簡(jiǎn)單應(yīng)用,dll的坑點(diǎn)以及擴(kuò)展后面兩章會(huì)說,到時(shí)候在總結(jié)。
自從M?i?c?r?o?s?o?f?t公司推出第一個(gè)版本的Wi?n?d?o?w?s操作系統(tǒng)以來,動(dòng)態(tài)鏈接庫(D?L?L)一直是這個(gè)操作系統(tǒng)的基礎(chǔ)。?Windows?API中的所有函數(shù)都包含在?D?L?L中。3個(gè)最重要的?D?L?L是K?e?r?n?e?l?3?2?.?d?l?l,它包含用于管理內(nèi)存、進(jìn)程和線程的各個(gè)函數(shù);?U?s?e?r?3?2?.?d?l?l,它包含用于執(zhí)行用戶界面任務(wù)(如窗口的創(chuàng)建和消息的傳送)的各個(gè)函數(shù);?G?D?I?3?2?.?d?l?l,它包含用于畫圖和顯示文本的各個(gè)函數(shù)。
本章將要介紹如何為應(yīng)用程序創(chuàng)建D?L?L。下面是為什么要使用D?L?L的一些原因:
??它們擴(kuò)展了應(yīng)用程序的特性。
??它們可以用許多種編程語言來編寫。
??它們簡(jiǎn)化了軟件項(xiàng)目的管理。
??它們有助于節(jié)省內(nèi)存。
??它們有助于資源的共享。
??它們有助于應(yīng)用程序的本地化。
??它們有助于解決平臺(tái)差異。
??它們可以用于一些特殊的目的。
19.1?DLL與進(jìn)程的地址空間
????在應(yīng)用程序(或另一個(gè)D?L?L)能夠調(diào)用D?L?L中的函數(shù)之前,D?L?L文件映像必須被映射到調(diào)用進(jìn)程的地址空間中。若要進(jìn)行這項(xiàng)操作,可以使用兩種方法中的一種,即加載時(shí)的隱含鏈接或運(yùn)行期的顯式鏈接。隱含鏈接將在本章的后面部分介紹,顯式鏈接將在第?2?0章中介紹。
????一旦D?L?L的文件映像被映射到調(diào)用進(jìn)程的地址空間中,?D?L?L的函數(shù)就可以供進(jìn)程中運(yùn)行的所有線程使用。實(shí)際上,?D?L?L幾乎將失去它作為?D?L?L的全部特征。對(duì)于進(jìn)程中的線程來說,D?L?L的代碼和數(shù)據(jù)看上去就像恰巧是在進(jìn)程的地址空間中的額外代碼和數(shù)據(jù)一樣。當(dāng)一個(gè)線程調(diào)用D?L?L函數(shù)時(shí),該D?L?L函數(shù)要查看線程的堆棧,以便檢索它傳遞的參數(shù),并將線程的堆棧用于它需要的任何局部變量。此外,D?L?L中函數(shù)的代碼創(chuàng)建的任何對(duì)象均由調(diào)用線程所擁有,而D?L?L本身從來不擁有任何東西。
可執(zhí)行文件的全局變量和靜態(tài)變量不能被同一個(gè)可執(zhí)行文件的多個(gè)運(yùn)行實(shí)例共享。Windows?98能夠確保這一點(diǎn),方法是在可執(zhí)行文件被映射到進(jìn)程的地址空間時(shí)為可執(zhí)行文件的全局變量和靜態(tài)變量分配相應(yīng)的存儲(chǔ)器。Windows?2000確保這一點(diǎn)的方法是使用第1?3章介紹的寫入時(shí)拷貝(c?o?p?y?-?o?n?-?w?r?i?t?e)機(jī)制。D?L?L中的全局變量和靜態(tài)變量的處理方法是完全相同的。當(dāng)一個(gè)進(jìn)程將D?L?L的映像文件映射到它的地址空間中去時(shí),系統(tǒng)將同時(shí)創(chuàng)建全局?jǐn)?shù)據(jù)變量和靜態(tài)數(shù)據(jù)變量的實(shí)例。
注意:
許多開發(fā)人員經(jīng)常會(huì)犯一個(gè)常見的錯(cuò)誤,因?yàn)樗麄兺浟巳舾蓚€(gè)C?/?C?+?+運(yùn)行期庫可以存在于單個(gè)地址空間中。請(qǐng)看下面的代碼:
D?L?L函數(shù)分配的內(nèi)存塊是由E?X?E的函數(shù)釋放的嗎?答案是可能的。上面顯示的代碼并沒有為你提供足夠的信息。如果E?X?E和D?L?L都鏈接到D?L?L的C?/?C?+?+運(yùn)行期庫,那么上面的代碼將能夠很好地運(yùn)行。但是,如果兩個(gè)模塊中的一個(gè)或者兩個(gè)都鏈接到靜態(tài)C?/?C?+?+運(yùn)行期庫,那么對(duì)free函數(shù)的調(diào)用就會(huì)失敗。
?
正確的姿勢(shì):
?
后面是一些基本的DLL開發(fā)和調(diào)用細(xì)節(jié),就不說了,還有就是建議不要通過函數(shù)編號(hào)來調(diào)用函數(shù),這個(gè)不太靠譜,可能會(huì)發(fā)生變動(dòng),但是如果是對(duì)速度要求極高的程序,可以考慮編號(hào)調(diào)用(前提是調(diào)用自己開發(fā)的DLL,這樣就不會(huì)有變動(dòng)了)。其他細(xì)節(jié)下一章說。
總結(jié)
以上是生活随笔為你收集整理的Windows核心编程 第十九章 DLL基础的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows核心编程 第十八章 堆栈
- 下一篇: Windows核心编程 第二十章 DLL