DLL基础——Windows核心编程学习手札之十九
DLL基礎
——Windows核心編程學習手札之十九
Windows API中的所有函數都包含在DLL中,3個最重要的DLL是Kernel32.dll,它包含用于管理內存、進程和線程的各個函數;User32.dll包含用于執行用戶界面任務(如窗口的創建和消息的傳送)的各個函數;GDI32.dll包含用于畫圖和顯示文本的各個函數。Windows還配有若干別的DLL,用于執行一些特殊任務,如AdvAPI32.dll包含用于實現對象安全性、注冊表操作和事件記錄的函數;ComDlg32.dll包含常用對話框(如File Open和File Save);ComCtl32.dll則支持所有的常用窗口控件。
在DLL中通常沒有用來處理消息循環或創建窗口的支持代碼,DLL只是一組源代碼模塊,每個模塊包含了應用程序(可執行文件)或另一個DLL將要調用的一組函數。當所有源代碼文件編譯后,它們就像應用程序的可執行文件那樣被鏈接程序所鏈接。對于一個DLL,需要設定鏈接程序的/DLL開關,該開關使得鏈接程序能夠向產生的DLL文件映像發出稍有不同的信息,如此,操作系統加載程序就能將該文件映像視為一個DLL而不是應用程序。在應用程序或另一個DLL能夠調用DLL中的函數之前,DLL文件映像必須被映射到調用進程的地址空間中,可選用加載時的隱含連接和運行期的顯示連接。一旦DLL的文件映像被映射到調用進程的地址空間中,DLL的函數就可以供進程中運行的所有線程使用。
創建DLL模塊步驟:
1)先創建一個頭文件,包含從DLL輸出的函數原型、結構和符號,DLL的所有源代碼模塊均包含該頭文件、以幫助創建DLL;
2)要創建一個C/C++源代碼模塊(或多個模塊),用于實現在DLL模塊中的函數和變量;
3)創建DLL模塊,編譯器對每個源代碼模塊進行處理,產生.obj模塊;
4)所有.obj模塊創建完成后,鏈接程序將所有.obj模塊內容組合在一起,產生一個DLL映像文件,包含用于DLL的所有二進制代碼和全局/靜態數據變量;
5)如果鏈接程序發現DLL的源代碼模塊至少輸出了一個函數或變量,那么鏈接程序也生成一個.lib文件,列出所有已輸出函數和變量的符號名;
創建可執行模塊(調用DLL)步驟:
6)在引用函數、變量、數據、結構或符號的所有源代碼模塊中,必須包含DLL開發人員創建的頭文件;
7)要創建一個C/C++源代碼模塊(或多個模塊),在可執行模塊中實現DLL中的函數和變量;
8)創建可執行模塊,編譯器生成.obj模塊,鏈接程序組合.obj生成可執行的映像文件;
運行可執行模塊(調用DLL),操作系統的加載程序執行步驟:
9)加載程序為新進程創建一個虛擬地址空間,可執行模塊被映射到新進程的地址空間,加載程序對可執行模塊的輸入進行分析。對于列出的每個DLL名字,加載程序找出用戶系統上的DLL模塊,再將該DLL映射到進行的地址空間。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的DLL基础——Windows核心编程学习手札之十九的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 堆栈——Windows核心编程学习手札之
- 下一篇: DLL的高级操作技术——Windows核