孙鑫VC++LESSON1:Windows程序内部运行原理
視頻鏈接:https://www.bilibili.com/video/BV1Ts411f7fw/?spm_id_from=333.337.search-card.all.click&vd_source=04d791790ccb453dc9e7113022339213
Windows程序內部運行原理
??Windows的程序設計是一種事件驅動的程序設計模式,主要是基于消息的,當用戶想完成某種功能時會調用操作系統的某種支持,然后操作系統將用戶的需要包裝成消息,并投遞到消息隊列當中,最后應用程序從消息隊列中取走消息并進行響應。
??箭頭①表示操作系統可以對輸入輸出設備進行控制,比如聲卡、音響;箭頭②表示操作系統能識別輸入輸出設備的狀態,包括鼠標的位置等。我們所關心的是應用程序和操作系統的交互關系。
??API正如其語義一樣,他已經成為一種被廣泛使用的專業術語,如果說某個系統、設備提供給某種應用程序,對其進行編程操作的函數類、組件等的集合,那么就稱作該系統的API。比如:購買語音卡附帶的開發包,他所提供的開發包的一些函數的集合就叫做語音卡的API。
MSG結構體
??MSDN是微軟提供給我們應用程序開發人員的一個在線幫助系統,包含了微軟所有的開發語言和開發工具的幫助文件。開發時,要安裝一個MSDN以便于查找資料。https://docs.microsoft.com/zh-cn/cpp/mfc/reference/wm-message-handlers-d-e?view=msvc-170
??HWND:窗口句柄;UINT在c語言中為unsigned int無符號整型,對于message定義了許多宏來代表相應的消息,他以WM_開頭,比如代表按下鼠標左鍵的宏為:WM_LBUTTONDOWN;WPARAM和LPARAM都是整型,WPARAM指示了消息的一個附加信息,LPARAM也是指示了消息的一個附加信息,比如我們在按下一個字母按鍵時,會受到一個WM_CHAR消息,但是我們并不知道按下的是哪一個按鍵,這是就會把這個字母的ASCII碼放到附加參數WPARAM中
??那么既然WPARAM和LPARAM都是兩個整形,那么為什么還要產生這兩個新的數據類型呢?
??比如他人寫的程序拿給你看,定義了X、Y,你并不知道代表的具體意義,這樣一看到WPARAM和LPARAM就知道這是一個消息的附加參數。
??DWORD中WORD是16位整數,D代表double,表示32位整數,用來指示這個消息被投遞時的時間;POINT是一個結構體,定義了一個點x坐標一個點y坐標,pt指示了當消息被投遞時光標所在的一個位置。
??對于每一個應用程序,操作系統都會給它建立一個消息隊列,其實是一個先進先出的緩沖區,通常是某種變量類型的數組,消息隊列里的每一個元素都是一條消息。應用程序取走隊列的第一條消息,在得到消息后就要對消息進行處理,這就是消息響應(通過編碼實現,過程中也可能會調用其它的API)。
WinMain函數
??我們再寫windows的c語言程序時都會先寫一個mian函數。
??HINSTANCE:應用程序實例句柄,每個運行中的應用程序都是一個實例,如果同一個應用打開好幾個,那么每一個就需要一個標識,HINSTANCE就是用來存放這種標識的數據類型。bInstance用來指示當前正在運行的實例句柄,bPrevInstance用來指先前實例的一個句柄(win32里面總是為空);LPSTR:LP代表長指針,STR代表指針,標識一個指向字符串首地址的指針,相當于char*,lpCmdLine是命令行參數,(argc用來指明命令行參數的個數,margv是一個指針數組,用來存放命令行參數);nCmdShow用來顯示狀態(當前為最大化還是最小化)。
??這個Winmain函數是一個入口點函數 ,這個函數是由操作系統去調用的,不是由我們去調用的,當操作系統啟動我們的程序的時候,他會給我們運行當中的程序分配一個實例號,通過這個參數就傳遞進來了,如果說啟動程序的時候傳遞了一個命令行參數,那么操作系統會將這個參數放到l第三個參數pCmdLine中傳遞進來,這些參數都是由操作系統賦值。
??既然我們現在開發的程序都是窗口應用 程序,那么
??style:窗口類的類型(其中有水平重畫、垂直重畫等)
總結
以上是生活随笔為你收集整理的孙鑫VC++LESSON1:Windows程序内部运行原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何写项目申请书
- 下一篇: 探索智能云服务新模式,云计算重大变革的新