[轉]Windows多進程編程


轉自:http://blog.csdn.net/bxhj3014/article/details/2082255 

一、進程的概念
       進程是是一個正在運行的程序的實例(飄~~~),是系統分配資源的單位(線程是執行的單位),包括內存,打開的文件、處理機、外設等,進程由兩部分組成:
      1、進程的內核對象:即我們通常所講的PCB(進程控制塊),該結構只能由該內核訪問,他是操作系統用來管理進程的一個數據結構,操作系統通過該數據結構來感知和管理進程;它的成員負責維護進程的各種信息,包括進程的狀態(創建、就緒、運行、睡眠、掛起、僵死等)、消息隊列等;同時也是系統用來存放關於進程的統計信息的地方。
      注:具體結構參照Linux的task_struct數據結構。
      2、進程的地址空間:包含所有可執行模塊或DLL模塊的代碼和數據,以及動態內存分配的空間,如線程堆棧和堆分配的空間。共有4G,0-2G為用戶區,2-4G為系統區。
二、進程的創建過程
      1、系統創建進程內核對象(PCB進程控制塊)。
      2、系統為新進程創建虛擬地址空間,幫將可執行文件或任何必要的DLL文件的代碼和數據加載到該進程的地址空間。
      3、系統為新進程的主線程創建一個線程內核對象(TCB線程控制塊)。
      4、通過執行C/C++運行期啟動代碼,該主線程開始運行。
      注:在Windows環境下,盡量用多線程而不是多進程。
三、與進程相關的API
1、創建進程
            BOOL CreateProcess(
                    PCTSTR      psApplicationName, //可執行文件的名字
                    PTSTR      pszCommandLine, //命令行字符串
                    PSECURITY_ATTRIBUTES psaProcess,   //進程對象的安全性
                    PSECURITY_ATTRIBUTES psaThread,   //線程對象的安全性
                    BOOL      bInheritHandles, //句柄可繼承性
                    DWORD      fdwCreate,   //標識符(優先級)
                    PVOID      pvEnvironment, //指向環境字符串
                    PCTSTR      pszCurDir,   //子進程當前目錄
                    PSTARTUPINFO    psiStartInfo,
                    PPROCESS_INFORMATION ppiProcInfo);   //進程線程句柄及ID
2、打開進程
            HANDLE OpenProcess(
                    DWORD dwDesiredAccess, //訪問安全屬性
                    BOOL bInheritHandle, //繼承屬性
                    DWORD hProcessId);   //進程ID
            注:獲取hPronessId指定的進程的內核對象的句柄
3、終止進程
(1)、主線程的進入點函數返回
(2)、進程自己終止自己
              VOID ExitProcess(
                        UINT fuExitCode); //退出代碼
(3)、終止自身進程或其他進程
              BOOL TerminateProcess(
                      HANDLE hProcess, //進程句柄
                      UINT fuExitCode); //退出代碼
三、與進程相關的API
4、獲取進程的可執行文件或DLL對應的句柄
              HMODULE GetModuleHandle(
                      PCTSTR pszModule); //模塊名稱
              注:當參數傳NULL時獲取的是進程的地址空間中可執行文件的基地址。
5、獲取與指定窗口關聯在一起的一個進程和線程標識符
              HANDLE GetWindowThreadProcessId(
                      HWND hWnd,    //窗口句柄
                      LPDWORD lpdwProcessId); //與該窗口相關的進程ID
6、獲取進程的運行時間
              Bool GetProcessTimes(
                      HANDLE hProcess,   //進程句柄
                      PFILETIME pftCreationTime, //創建時間
                      PFILETIME pftExitTime, //退出時間
                      PFILETIME pftKernelTime, //內核時間
                      PFILETIME pftUserTime); //用戶時間
              注:返回的時間適用於某個進程中的所有線程(甚至已經終止運行的線程)。
7、獲取當前進程的一個偽句柄
              HANDLE GetCurrentProcess();
               注:該函數獲取當前進程的偽句柄,通常情況值為-1,只能標識當前進程內核對象,
                      可以復制,但不可繼承。不必調用CloseHandle()函數來關閉這個句柄。
8、將進程的偽句柄轉換為實句柄
              HANDLE DuplicateHandle(
                      GetCurrentProcess(),
                      GetCurrentProcess(),
                      GetCurrentProcess(),
                      &hProcess,
                      0,
                      FALSE ,
                      DUPLICATE_SAME_ACCESS);
9、獲取當前進程ID
              DWORD GetCurrentProcessId();
10、獲取進程優先級
              DWORD GetPriorityClass(
                   HANDLE hProcess);
11、修改進程的優先級類
              BOOL SetPriorityClass(
                     HANDLE hProcess, //進程句柄
                     DWORD fdwPriority); //相對進程優先級
              注1:相對線程優先級
                     實時: REALTIME_PRIORITY_CLASS
                     高: HIGH_PRIORITY_CLASS
                     高於正常; ABOVE_NORMAL_PRIORITY_CLASS
                     正常: NORMAL_PRIORITY_CLASS
                     低於正常: BELOW_NORMAL_PRIORITY_CLASS
                     空閑: IDLE_PRIORITY_CLASS
              注2:只要擁有進程的句柄和足夠的權限,就能夠修改系統中運行的任何進程的優
                       先級類。
12、獲取進程句柄計數
              BOOL GetProcessHandleCount(
                      HANDLE hProcess,   //句柄
                      PDWORD pdwHandleCount); //句柄計數
13、獲取環境塊
              DWORD GetEnvironmentVariable(
                      LPCTSTR lpName, //環境變量的名字
                      LPTSTR lpValue, //存放返回字符串的緩沖區
                      DWORD cchValue); //緩沖區的大小
              注:返回值為返回字符串的長度,當緩存不足時返回所需字符串的長度
14、設置環境塊
              BOOL SetEnvironmentVariable(
                      LPCTSTR lpName, //環境變量的名字
                      LPCTSTR lpValue); //存放變量值字符串的緩沖區


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM