C++基礎(chǔ)語(yǔ)法梳理:Windows 的動(dòng)態(tài)鏈接庫(kù)

Windows 應(yīng)用程序入口函數(shù)
GUI(Graphical User Interface)應(yīng)用,鏈接器選項(xiàng):/SUBSYSTEM:WINDOWS
CUI(Console User Interface)應(yīng)用,鏈接器選項(xiàng):/SUBSYSTEM:CONSOLE
_tWinMain 與 _tmain 函數(shù)聲明

Windows 的動(dòng)態(tài)鏈接庫(kù)(Dynamic-Link Library)
部分知識(shí)點(diǎn)來(lái)自《Windows 核心編程(第五版)》
用處
(1)擴(kuò)展了應(yīng)用程序的特性
(2)簡(jiǎn)化了項(xiàng)目管理
(3)有助于節(jié)省內(nèi)存
(4)促進(jìn)了資源的共享
(5)促進(jìn)了本地化
(6)有助于解決平臺(tái)間的差異
(7)可以用于特殊目的
注意
(1)創(chuàng)建 DLL,事實(shí)上是在創(chuàng)建可供一個(gè)可執(zhí)行模塊調(diào)用的函數(shù)
(2)當(dāng)一個(gè)模塊提供一個(gè)內(nèi)存分配函數(shù)(malloc、new)的時(shí)候,它必須同時(shí)提供另一個(gè)內(nèi)存釋放函數(shù)(free、delete)
(3)在使用 C 和 C++ 混編的時(shí)候,要使用 extern "C" 修飾符
(4)一個(gè) DLL 可以導(dǎo)出函數(shù)、變量(避免導(dǎo)出)、C++ 類(lèi)(導(dǎo)出導(dǎo)入需要同編譯器,否則避免導(dǎo)出)
(5)DLL 模塊:cpp 文件中的 __declspec(dllexport) 寫(xiě)在 include 頭文件之前
(6)調(diào)用 DLL 的可執(zhí)行模塊:cpp 文件的 __declspec(dllimport) 之前不應(yīng)該定義 MYLIBAPI
加載 Windows 程序的搜索順序
1、包含可執(zhí)行文件的目錄
2、Windows 的系統(tǒng)目錄,可以通過(guò) GetSystemDirectory 得到
3、16 位的系統(tǒng)目錄,即 Windows 目錄中的 System 子目錄
4、Windows 目錄,可以通過(guò) GetWindowsDirectory 得到
5、進(jìn)程的當(dāng)前目錄
6、PATH 環(huán)境變量中所列出的目錄
DLL 入口函數(shù)
DllMain 函數(shù)
載入卸載庫(kù)
LoadLibrary、LoadLibraryExA、LoadPackagedLibrary、FreeLibrary、FreeLibraryAndExitThread 函數(shù)聲明
顯示地鏈接到導(dǎo)出符號(hào)
GetProcAddress 函數(shù)聲明
DumpBin.exe 查看 DLL 信息
在?VS 的開(kāi)發(fā)人員命令提示符?使用?DumpBin.exe?可查看 DLL 庫(kù)的導(dǎo)出段(導(dǎo)出的變量、函數(shù)、類(lèi)名的符號(hào))、相對(duì)虛擬地址(RVA,relative virtual address)。如:
LoadLibrary 與 FreeLibrary 流程圖
LoadLibrary 與 FreeLibrary 流程圖
LoadLibrary

FreeLibrary

DLL 庫(kù)的編寫(xiě)(導(dǎo)出一個(gè) DLL 模塊)
DLL 庫(kù)的編寫(xiě)(導(dǎo)出一個(gè) DLL 模塊) DLL 頭文件
DLL 源文件
DLL 庫(kù)的使用(運(yùn)行時(shí)動(dòng)態(tài)鏈接 DLL)
DLL 庫(kù)的使用(運(yùn)行時(shí)動(dòng)態(tài)鏈接 DLL)
運(yùn)行庫(kù)(Runtime Library)
典型程序運(yùn)行步驟
(1)操作系統(tǒng)創(chuàng)建進(jìn)程,把控制權(quán)交給程序的入口(往往是運(yùn)行庫(kù)中的某個(gè)入口函數(shù))
(2)入口函數(shù)對(duì)運(yùn)行庫(kù)和程序運(yùn)行環(huán)境進(jìn)行初始化(包括堆、I/O、線(xiàn)程、全局變量構(gòu)造等等)。
(3)入口函數(shù)初始化后,調(diào)用 main 函數(shù),正式開(kāi)始執(zhí)行程序主體部分。
(4)main 函數(shù)執(zhí)行完畢后,返回到入口函數(shù)進(jìn)行清理工作(包括全局變量析構(gòu)、堆銷(xiāo)毀、關(guān)閉I/O等),然后進(jìn)行系統(tǒng)調(diào)用結(jié)束進(jìn)程。
一個(gè)程序的 I/O 指代程序與外界的交互,包括文件、管程、網(wǎng)絡(luò)、命令行、信號(hào)等。更廣義地講,I/O 指代操作系統(tǒng)理解為 “文件” 的事物。
glibc 入口
_start -> __libc_start_main -> exit -> _exit
其中?main(argc, argv, __environ)?函數(shù)在?__libc_start_main?里執(zhí)行。
MSVC CRT 入口
int mainCRTStartup(void)
執(zhí)行如下操作:
(1)初始化和 OS 版本有關(guān)的全局變量。
(2)初始化堆。
(3)初始化 I/O。
(4)獲取命令行參數(shù)和環(huán)境變量。
(5)初始化 C 庫(kù)的一些數(shù)據(jù)。
(6)調(diào)用 main 并記錄返回值。
(7)檢查錯(cuò)誤并將 main 的返回值返回。
C 語(yǔ)言運(yùn)行庫(kù)(CRT)
大致包含如下功能:
啟動(dòng)與退出:包括入口函數(shù)及入口函數(shù)所依賴(lài)的其他函數(shù)等。
標(biāo)準(zhǔn)函數(shù):有 C 語(yǔ)言標(biāo)準(zhǔn)規(guī)定的C語(yǔ)言標(biāo)準(zhǔn)庫(kù)所擁有的函數(shù)實(shí)現(xiàn)。
I/O:I/O 功能的封裝和實(shí)現(xiàn)。
堆:堆的封裝和實(shí)現(xiàn)。
語(yǔ)言實(shí)現(xiàn):語(yǔ)言中一些特殊功能的實(shí)現(xiàn)。
調(diào)試:實(shí)現(xiàn)調(diào)試功能的代碼。
C語(yǔ)言標(biāo)準(zhǔn)庫(kù)(ANSI C)
包含:
標(biāo)準(zhǔn)輸入輸出(stdio.h)
文件操作(stdio.h)
字符操作(ctype.h)
字符串操作(string.h)
數(shù)學(xué)函數(shù)(math.h)
資源管理(stdlib.h)
格式轉(zhuǎn)換(stdlib.h)
時(shí)間/日期(time.h)
斷言(assert.h)
各種類(lèi)型上的常數(shù)(limits.h & float.h)
變長(zhǎng)參數(shù)(stdarg.h)
非局部跳轉(zhuǎn)(setjmp.h)

今天的分享就到這里了,大家要好好學(xué)C++喲~
寫(xiě)在最后:對(duì)于準(zhǔn)備學(xué)習(xí)C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開(kāi)始!
微信公眾號(hào):C語(yǔ)言編程學(xué)習(xí)基地
C語(yǔ)言零基礎(chǔ)入門(mén)教程(83集全)
整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門(mén)教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長(zhǎng)比自己琢磨更快哦!
