【Windows核心編程筆記】第十九章 DLL基礎

Kernel32.dll    管理內存、進程以及線程相關的API函數

User32.dll       執行與用戶界面相關任務的API函數

GDI32.dll        繪製圖像和顯示文字相關的API函數

 

爲什麼要用DLL?

擴展了應用程序的特性

簡化了項目管理

有助於節省內存

促進了資源共享

促進本地化

有助於解決平臺差異

用於特殊目的

 

DLL和進程的地址空間

通過指定/DLL開關區分程序是Dll還是應用程序

調用Dll中的函數之前,需要將dll文件映射到進程的地址空間(隱式或者顯式)

Dll不會擁有任何對象,調用線程或進程所擁有

一個地址空間=一個可執行模塊+多個dll模塊

 

縱觀全局

隱式鏈接:頭文件+dll+lib

 

構建DLL模塊

導出變量:儘量避免,難維護

導出函數:多數情況

導出類:導出和導入模塊使用的編譯器是同一家廠商時,纔可以

 

使用DumpBin.exe工具(加上-exports開關)可以查看dll的導出段

DUMPBIN –exports Kernel32.dll

 

爲非VC++工具包創建dll

混合使用C和C++時,要使用extern “C”避免名稱改編

純C開發時,使用__stdcall調用約定,Microsoft也會對名稱改編,解決辦法:

使用def文件(推薦)

#pragma comment (linker, “/exports:MyFunc=_MyFunc@8”) 添加在dll源文件

 

構建可執行模塊

加載程序要載入所有相關的dll模塊,並用所有導出符號的正確地址來修復每個模塊的導入段,爲了減少加載時初始化時間,我們應該對可執行模塊和dll模塊進行基地址重定位和綁定

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章