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