標籤:資料 靜態 block 通過 ext 引用 turn 對話 src
Windows 進程及線程
● 進程的組成
○ 進程是“惰性”的,進程要做的任何事情,都必須讓線程來運行,線程執行進程地址空間中包含的代碼
? 進程本身無法運行任何東西
? 進程劃定一個地區,存在一些代碼,這些代碼都是靜態存在的
○ 一個進程可以擁有多個線程,所有的線程都能夠在進程的地址弓箭中“同時”運行代碼,每個線程都有他自己的一組CPU寄存器以及自己的堆棧。
? 一個進程最少可以有一個線程
? 如果一個進程裡面沒有線程會被銷毀
○ 每個進程必須有一個線程,當系統建立一個進程時,會自動建立一個線程。這個線程我們稱為主線程。如果沒有線程要執行進程地址空間中的代碼,進程就失去了存在的意義,此時系統會自動銷毀進程以及它的地址空間
? 線程執行CPU的代碼
? Windows是一個支援多進程技術的作業系統
○ 作業系統會以輪詢的方式為每一個線程分配CPU時間片,從營造出“並行”的假象。
○ 如果電腦擁有多個CPU,作業系統會更複雜的方式為線程分配CPU時間。
● 核心對象
○ 作業系統用來管理進程
● 地址空間
○ 包含了可執行檔及DLL模組的代碼和資料
應用程式類型
● 控制台使用者介面
○ 控制台程式則是基於文本的它們一般不會建立視窗或進程訊息,而且不需要GUI
? 通過文本互動的程式都叫做CUI
? 基於文本操作的叫做CUI
? 並不是說CMD執行的程式就叫做CUI
//我們現在學習的win32api 都是跟C 函數模式的//跟C++關係不大,因為C++是類封裝
● 圖形化使用者介面
○ GUI程式一個圖形化的前端,它可以建立視窗,可以擁有菜單,能通過對話方塊與使用者互動,還能使用所有標磚 “視窗化” 的東西 Windows 的幾乎所有附件應用程式都是GUI程式
● 區別
○ 1.在 VS中,CUI程式的連結器開關位 /SUBSYSTEM:CONSOLE,GUI程式的連結器開關位 /SUBSYSTEM:WINDOWS.在載入時,會擷取此值,如果是一個文本控制台視窗,作業系統會使用命令提示字元啟動這個程式,否則它只是載入這個,由應用程式來管理自己的視窗
○ 2.入口函數不同
int WINAPI _tWinMain( HINSTANCE hInstanceExe, HINSTANCE hPreInstancec, PTSTR pszCmdLine, int nCmdShow);
1 int _tmain(2 int argc,3 TCHAR *argv[],4 TCHAR *envp[]5 );
○ 啟動函數不同,GUI的啟動函數位 WinMainCRTStartup或wWinMainCRtatup,CUI的啟動函數為mainCRTStartup或wmainCStartup
? 命令提示字元是一個軟體,完全獨立軟體
? 我們開發的程式是另外一個軟體,如果裡面設定了命令列,或者控制台,使用者介面屬性
1 #include <Window.h> 2 #include <tchar.h> 3 //Main CUI -> 4 //WinMin GUI ->建立或附加一個控制台程式 5 6 //程式 7 //無法解析外部符號 _main,該符號在函數 "int __cdecl invoke main(void)" ([email protected]@YAHXZ)中被引用 8 //找Main函數 9 //無法解析的外部符號 [email protected],該符號在函數 "int __cdecl invoke_main(void)" ([email protected]@YAHXZ) 中被引用10 //找WinMain函數11 //CUI12 int main()13 {14 return 0;15 }16 //GUI程式的連結器開關位17 int WINAPI _tWinMain(18 _In_ HINSTANCE hInstance, //進程控制代碼19 _In_ HINSTANCE hPrevInstance, //前一個進程的控制代碼 盡量不要使用 或者不使用20 _In LPTSTR lpCmdLine, //命令列21 _In_ int nCmdShow) //顯示的方式 SW_SHOW SW_HIDE22 {23 return 024 }
1 #include <tchar.h> 2 #include <windows.h> 3 4 #include <stdio.h> 5 6 int main( ) 7 { 8 HINSTANCE hInstance = GetModuleHandle(NULL); //擷取視窗控制代碼 9 //程式基質0x40000010 printf("0x%x\r\n",hInstance );11 12 TCHAR* const strCommline = GetCommandLine();13 //LPTSTR WINAPI GetCommandLine(void);14 _tprintf(TEXT("%s\r\n"),strCommline);15 int nNumArgv;16 LPWSTR* ppArgv = CommandLineToArgvW( strCommline, &nNumArgv);17 if( ppArgv != NULL)18 {19 for(int nIndex = 0; nIndex < nNumArgv; ++nIndex )20 {21 _tprintf( TEXT("%s\r\n"), ppArgv[nIndex] );22 }23 }24 25 26 system("pause");27 return 0;28 }
1 //環境變數2 LPTCH strPath = GetEnvironmentString();3 _tprintf(TEXT("%s \r\n"), strPath);4 //FreeEnvironmentStrings();
013 Windows進程及線程