[轉]Windows多進程編程

來源:互聯網
上載者:User

標籤:.exe   根目錄   mda   str   win   close   spec   臨時檔案   自身   

轉自:2082255

一、進程的概念

  進程是是一個正在啟動並執行程式的執行個體,是系統分配資源的單位(線程是執行的單位),包括記憶體,開啟的檔案、處理機、外設等,進程由兩部分組成:

  1. 進程的核心對象:即我們通常所講的PCB(進程式控制制塊),該結構只能由該核心訪問,他是作業系統用來管理進程的一個資料結構,作業系統通過該資料結構來感知和管理進程;它的成員負責維護進程的各種資訊,包括進程的狀態(建立、就緒、運行、睡眠、掛起、僵死等)、訊息佇列等;同時也是系統用來存放關於進程的統計資訊的地方。

  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、開啟進程 (擷取hProcessId對應的進程的核心物件控點)
            HANDLE OpenProcess(
                    DWORD dwDesiredAccess, //訪問安全屬性
                    BOOL bInheritHandle,  //繼承屬性
                    DWORD hProcessId);   //進程ID

  3、終止進程
    (1)主線程的進入點函數返回
    (2)進程自己終止自己
                VOID ExitProcess(
                          UINT fuExitCode); //結束代碼
    (3)終止自身進程或其他進程
                BOOL TerminateProcess(
                        HANDLE hProcess, //進程控制代碼
                        UINT fuExitCode); //結束代碼

  4、擷取進程的可執行檔或DLL對應的控制代碼
              HMODULE GetModuleHandle(
                      PCTSTR pszModule); //模組名稱
              註:當參數傳NULL時擷取的是進程的地址空間中可執行檔的基地址。

  5、找出某個指定視窗的建立者(線程或進程),返回建立者的ID。哪個線程建立了這個視窗,返回的就是這個線程的id號 (進程只有一個線程的話,那麼線程標誌符與進程標誌符就是指同一個標誌符)。
              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()函數來關閉這個控制代碼。
                    偽控制代碼只能用於進程內部,如果你想得到實際得控制代碼,在進程間進行通訊,必需要進行轉化,調用DuplicateHandle,注意,得實控制代碼使用完成以後,你必須要調用CloseHandle去關閉.

  8、將進程的偽控制代碼轉換為實控制代碼
              HANDLE DuplicateHandle(
                        GetCurrentProcess(),
                        GetCurrentProcess(),
                        GetCurrentProcess(),
                        &hProcess,
                        0,
                        FALSE ,
                        DUPLICATE_SAME_ACCESS); 

    註:執行個體控制代碼必須要調用CloseHandle()函數來關閉這個控制代碼,否則有控制代碼泄露。

  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); //緩衝區的大小
              註:傳回值為返回字串的長度,當緩衝不足時返回所需字串的長度。常用的系統內容變數如下:

 1 WINDIR:                 //系統目錄 - C:\WINDOWS   2 SYSTEMROOT:             //系統目錄 - C:\WINDOWS   3 SYSTEMDRIVE:            //系統根目錄 - C:   4 HOMEDRIVE:              //目前使用者根目錄 - C:   5 USERPROFILE:            //目前使用者目錄 - C:\Users\Kandy   6 HOMEPATH:               //目前使用者路徑 - \Users\Kandy   7 TMP:                    //目前使用者臨時檔案夾 - C:\Users\Kandy\AppData\Local\Temp   8 TEMP:                   //目前使用者臨時檔案夾 - C:\Users\Kandy\AppData\Local\Temp   9 APPDATA:                //目前使用者資料檔案夾 - C:\Users\Kandy\AppData\Roaming  10 PROGRAMFILES:           //程式預設安裝目錄 - C:\Program Files (x86)  11 COMMONPROGRAMFILES:     //檔案通用目錄 - C:\Program Files (x86)\Common Files  12 USERNAME:               //目前使用者名 - Kandy  13 ALLUSERSPROFILE:        //所有使用者檔案目錄 - C:\ProgramData  14 OS:                     //作業系統名 - Windows_NT  15 COMPUTERNAME:           //電腦名稱 - KANDY-PC  16 NUMBER_OF_PROCESSORS:   //處理器個數 - 4  17 PROCESSOR_ARCHITECTURE: //處理器晶片架構 - x86  18 PROCESSOR_LEVEL:        //處理器型號 - 6  19 PROCESSOR_REVISION:     //處理器修訂編號 - 3c03  20 USERDOMAIN:             //包含使用者帳號的域 - KANDY-PC  21 COMSPEC:                //C:\WINDOWS\system32\cmd.exe  22 PATHEXT:                //執行檔案類型 - .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC  23 PATH:                   //搜尋路徑  

 

  14、設定環境變數
              DWORD SetEnvironmentVariable(
                        LPCTSTR lpName, //環境變數的名字
                        LPCTSTR lpValue); //存放變數值字串的緩衝區
              註:當環境變數lpName不存在,且lpValue不為空白時,將建立一個新的環境變數。

[轉]Windows多進程編程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.