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模塊進行基地址重定位和綁定