從第四章開始就進入了“進程”。
關於進程,先給出如下一個定義:“進程”是一個正在啟動並執行程式的“執行個體”,是“線程”的一個“容器”。它包含兩個部分:作業系統用來管理該進程的一個核心對象和一個包含有可執行模組或DLL模組的代碼和資料以及動態記憶體分配的空間的“地址空間”。
進程只是一個容器,所以進程是“不活躍”的,我們把它僅作為一個容器來學習,那麼作為一個容器,我們就應該考慮我們怎麼來建立這個容器,管理這個容器和銷毀這個容器。
在進程中有一個或多個線程,當一個進程建立時,該進程的主線程也被建立,也就是說,一個進程至少包括一個主線程。
當一個進程中有多個線程在執行的時候,Windows作業系統採用時間片的方法將這些線程分配給CPU進行調度,也就是每個線程輪流地獲得一定的CPU調度時間,從而執行相關操作。
當一個C/C++編寫的程式運行時,都需要一個入口函數。預設地,有4個函數可供選擇——WinMain、wWinMain、main、wmain。前兩個可以被_tWinMain替代,是GUI(圖形化使用者介面)的主函數;後兩個可以被_tmain替代,是CUI(控制台使用者介面)的主函數。其中,帶首碼w表示是UNICODE版本,不帶w的表示是普通ANSI版本。連結器查看連結開關,決定是調用GUI還是CUI的主函數。
當一個程式執行後,我們可以通過“GetStartupInfo函數”擷取該進程的啟動資訊,它的參數是一個“指向STARTUPINFO結構的指標”,要使用這個函數,必須先設定STARTUPINFO的cb欄位的大小為sizeof(STARTUPINFO),然後方可將它的地址傳遞給GetStartupInfo函數,擷取進程啟動資訊。
每個可執行程式或DLL檔案被載入進記憶體中,都分配一個唯一的“執行個體控制代碼”標識它們。這個執行個體控制代碼就是傳遞給(w)WinMain主函數的HINSTANCE hInstance參數,這個執行個體控制代碼就是可執行程式的“基地址”。一些API函數也需要一個HMOUDLE的模組控制代碼作為參數運行。在32位和32位以上的系統中,HINSTANCE和HMOUDLE是完全相同的兩個類型,沒有什麼差別,你可以使用“GetModuleHandle函數”獲得一個程式的執行個體控制代碼(模組控制代碼)。
建立進程,微軟為我們提供了一個GreateProcess()函數,該函數返回一個進程核心物件控點,通過這個控制代碼可以方便的管理進程這個容器。但是就像木桶這個一個容器,有大有小,而且形狀也各異,自然建立一個具體的進程也要涉及這些性質,所以在建立時,微軟為我們提供了各種參數。對於各種屬性我們可以通過Get*函數取得通過Set*設定。
終止進程,書上給了四種方法:
1、主線程進入點函數自動返回;
2、在本進程中呼叫ExitProcess(UINT )函數,傳遞一個傳回碼給它,以此結束本進程;
3、在本進程或其他進程中呼叫TerminateProcess(HANDLE, UINT)函數,傳遞一個進程控制代碼和一個傳回碼給它,以結束該控制代碼標識的進程,這個被結束的進程的傳回碼就是傳遞給該函數的傳回碼;
4、進程中所有線程自動終止,這種情況很少會出現。
建議採用第1種方法:主線程的進入點函數返回。
第四章講的東西很基礎,後面提到了還UAC機制(使用者存取控制,這個是Windows Vista需要考慮的),因為無法徹底理解,所以以後再總結。