《Windows核心編程》筆記3 — 進程

來源:互聯網
上載者:User
接上.......

二 進程
2.建立進程
    使用建立進程函數,即可建立相應的進程:
 

BOOL CreateProcess(
   PCTSTR pszApplicationName,
   PTSTR pszCommandLine,
   PSECURITY_ATTRIBUTES psaProcess,
   PSECURITY_ATTRIBUTES psaThread,
   BOOL bInheritHandles,
   DWORD fdwCreate,
   PVOID pvEnvironment,
   PCTSTR pszCurDir,
   PSTARTUPINFO psiStartInfo,
   PPROCESS_INFORMATION ppiProcInfo);

    注意幾點,(1)調用建立進程函數肯定是在一個進程的線程中完成的。(2)系統會為該進程建立一個進程的核心對象。(3)由於進程建立後會自動建立一個該進程的主線程,所以,系統也會建立一個線程的核心對象。(4)系統會為進程分配相應的虛擬位址記憶體空間,並將可執行檔以及相應的DLL檔案和代碼載入到該虛擬記憶體空間中去。

    進程的主線程建立後,主線程便開始運行,如果成功的建立了進程,則CreateProcess返回TRUE。

    參數詳解:
    pszApplicationName與pszCommandLine分別表示新進程使用的可執行檔名稱與傳遞給新進程的命令列字元集。比如,用記事本開啟一個檔案檔案: TCHAR path[] = TEXT("MyText.txt");
CreateProcess("C:\\Windows\System32\\Notepad.exe",path,.....);

    下面PSECURITY_ATTRIBUTES psaProcess與PSECURITY_ATTRIBUTES psaThread則設定該進程與進程的主線程的安全性。如設定預設安全,則設定NULL即可。bInheritHandles則設定此進程所擁有核心對象的繼承性。比如,ProcessA中建立一個進程ProcessB,且設定bInheritHandles為TRUE,則ProcessB就擁有了訪問ProcessA的擁有核心對象的訪問能力。在ProcessB中只要Open*開啟相應的進程即可調用相應的核心對象。

    fdwCreate參數用於標識標誌,以便規定用來如何建立新進程。詳細的查看MSDN或《Windows核心編程》。

    pvEnvironment用來設定進程的環境參數,每個進程都有一個環境塊,是進程地址空間中分配的一塊記憶體。每個環境塊都有一串字串,作用跟系統中環境變數的作用差不多。一般來說設定NULL,以表示繼承父進程的環境參數。可以用PVOID GetEnvironmentStrings()獲得調用進程正在使用的環境字串資料區塊的地址

    pszCurDir是設定新進程的磁碟機與目錄,如果是NULL,則工作目錄將與本進程處於同目錄中。

     psiStartInfo記錄STARTUPINFO 結構的資訊,大多數進程創只需要使用預設值,我們只需要定義該結構,然後初始化清零即可: STARTUPINFO si = {sizeof(si)}
CreateProcess(..&si,..)

    其它參數的詳解可見MSDN或書本
    當然,在程式中可以獲得其值,如:
   

STARTUPINFO si = {sizeof(si)};
GetStartupInfo(&si);

ppiProcInfo參數用於指向你必須指定的PROCESS_INFORMATION結構。CreateProcess在返回之前要對該結構的成員進行初始化。該結構的形式如下面所示:

typedef struct _PROCESS_INFORMATION
{
   HANDLE hProcess;
   HANDLE hThread;
   DWORD dwProcessId;
   DWORD dwThreadId;
} PROCESS_INFORMATION;

如前所述,建立新進程可使系統建立一個進程核心對象和一個線程核心對象。在建立進程的時候,系統為每個對象賦予一個初始使用計數值1 。然後,在createProcess返回之前,該函數開啟進程對象和線程對象,並將每個對象的與進程相關的控制代碼放入PROCESS_INFORMATION結構的hProcess和hThread 成員中。當CreateProcess 在內部開啟這些對象時,每個對象的使用計數就變為2 。 
    以後,需要用到該進程或主線程的控制代碼時,即可用該變數的hProcess和hThread屬性來獲得。

3.終止進程
    1.主線程的返回退出(Best)
    2.使用函數ExitProcess(Not Use)
    3.使用函數TerminateProcess(Not Use)
    4.進程中的所有線程終止運行(impossibility)
    為什麼說第一種方法最好,因為:(1)C++代碼的解構函式能夠被正確執行。(2)系統會正確的釋放線程堆棧使用的記憶體。(3)系統會將進程的結束代碼設定為進入點函數的傳回值。(4)進程的核心對象會減
1。

    如果使用ExitProcess來退出進程,則該函數後的代碼將不會被執行,比如C++代碼中調用了ExitProcess,則很多個物件建立完成之後,還沒被析構進程就退出了,這樣容易出現記憶體的泄漏。另外,進程中使用的資源也會匯漏。
    使用方法:在代碼中使用 ExitProcess(0)即可終止進程運行。

    TerminateProcess函數也可以終止進程,但它與ExitProcess的區別是它不光可以終止本身的進程,亦可終止其它進程的運行。函數的原型是這樣的:
   

BOOL TerminateProcess(HANDLE hProcess, UINT fuExitCode);

    它需要有個進程的控制代碼。以便結構該進程。

    TerminateProcess是個非同步函數,什麼是非同步函數,就是說,當TerminateProcess返回時,我們無法保證該進程已經終止運行。如果要確定進程是否終止運行,需調用WaitForSingleObject函數或類似的函數。

4.建立子進程
    書本上提到,為何要建立子進程?它說:
    如果需要處理非常複雜的任務,我們也可以在進程中建立一個新的線程來執行這種操作,但是,進程中的線程都是共用進程的地址空間的,這樣帶來一個問題。線程可能更改地址空間中的內容,我們需要保護地址空間內容不被更改,那麼,我們可以用建立新進程的方法來實現它。

    Windows進程間傳遞資料的問題。如何在Windows的進程中傳遞資料,系統提供了很多種方法。比如:動態資料交換DDE,OLE,郵箱,管道等,其中,最有用的非記憶體對應檔莫屬。

    書中舉了一例,使用WaitForSingleObject來獲得子進程結束代碼PROCESS_INFORMATION pi;
DWORD dwExitCode;

//Spawn the child process.
BOOLfSuccess = CreateProcess(, π);

if(fSuccess)
{
   //Close the thread handle as soon as it is no longer needed!
   CloseHandle(pi.hThread);

   //Suspend our execution until the child has terminated.
   WaitForSingleObject(pi.hProcess,INFINITE);

   //The child process terminated;get its exit code.
   GetExitCodeProcess(pi.hProcess,
      &dwExitCode);

   //Close the process handle as soon as it is no longer needed.
   CloseHandle(pi.hProcess);
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.