LPPROCESS_INFORMATION

HANDLE dwProcessId; dwThreadId;}

結構原型

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

參數說明

調用CreatePorcess()函式後,會自動地對該結構進行填充.
hProcess
存放每個對象的與進程相關的句柄
hThread
返回的執行緒句柄。
dwProcessId
用來存放進程ID號
dwThreadId
用來存放執行緒ID號

相關知識

如前所述,創建新進程可使系統建立一個進程核心對象和一個執行緒核心對象。在創建進程的時候,系統為每個對象賦予一個初始使用計數值1 。然後,在createProcess返回之前,該函式打開進程對象和執行緒對象,並將每個對象的與進程相關的句柄放入PROCESS_INFORMATION結構的hProcess和hThread 成員中。當CreateProcess 在內部打開這些對象時,每個對象的使用計數就變為2 。
這意味著在系統能夠釋放進程對象前,該進程必須終止運行(將使用計數遞減為1),並且父進程必須調用CloseHandle(再將使用計數遞減1,使之變為0)。同樣,若要釋放執行緒對象,該執行緒必須終止運行,父進程必須關閉執行緒對象的句柄(關於釋放執行緒對象的詳細說明,請參見本章後面“子進程”一節的內容)
注意必須關閉子進程和它的主執行緒的句柄,以避免在應用程式運行時泄漏資源。當然,當進程終止運行時,系統會自動消除這些泄漏現象,但是,當進程不再需要訪問子進程和它的執行緒時,編寫得較好的軟體能夠顯式關閉這些句柄(通過調用CloseHandle函式來關閉)。不能關閉這些句柄是開發人員最常犯的錯誤之一。
由於某些原因,許多開發人員認為,關閉進程或執行緒的句柄,會促使系統撤消該進程或執行緒。實際情況並非如此。關閉句柄只是告訴系統,你對進程或執行緒的統計數據不感興趣。進程或執行緒將繼續運行,直到它自己終止運行。
當進程核心對象創建後,系統賦予該對象一個獨一無二的標識號,系統中的其他任何進程核心對象都不能使用這個相同的ID號。執行緒核心對象的情況也一樣。當一個執行緒核心對象創建時,該對象被賦予一個獨一無二的、系統範圍的I D號。進程I D和執行緒I D共享相同的號碼池。這意味著進程和執行緒不可能擁有相同的I D 。另外,對象決不會被賦予0 作為其I D。在CreateProcess返回之前,它要用這些I D填入PROCESS_INFORMATION結構的dwProcessId和dwThreadId成員中。I D使你能夠非常容易地識別系統中的進程和執行緒。一些實用工具(如Task Manager)對I D使用得最多,而高效率的應用程式則使用得很少。由於這個原因,大多數應用程式完全忽略ID。
如果應用程式使用I D來跟蹤進程和執行緒,必須懂得系統會立即復用進程I D和執行緒ID。例如,當一個進程被創建時,系統為它指定一個進程對象,並為它賦予ID值1 2 2。如果創建了一個新進程對象,系統不會將相同的I D賦予給它。但是,如果第一個進程對象被釋放,系統就可以將1 2 2賦予創建的下一個進程對象。記住這一點後,就能避免編寫引用不正確的進程對象或執行緒對象的代碼。獲取進程I D是很容易的,保存該I D也不難,但是,接下來你應該知道,該I D標識的進程已被釋放,新進程被創建並被賦予相同的I D。當使用已經保存的進程I D時,最終操作的是新進程,而不是原先獲得I D的進程。
有時,運行的應用程式想要確定它的父進程。首先應該知道只有在生成子進程時,才存在進程之間的父子關係。在子進程開始執行代碼前, Wi n d o w s不再考慮存在什麼父子關係。較早的Wi n d o w s 版本沒有提供讓進程查詢其父進程的函式。現在, To o l H e l p 函式通過P R O C E S S E N T RY 3 2結構使得這種查詢成為可能。在這個結構中有一個t h 3 2 P a r e n t P r o c e s s I D成員,根據文檔的說明,它能返回進程的父進程的I D。
系統無法記住每個進程的父進程的I D,但是,由於I D是被立即重複使用的,因此,等到獲得父進程的I D時,該I D可能標識了系統中一個完全不同的進程。父進程可能已經終止運行。如果應用程式想要與它的“創建者”進行通信,最好不要使用I D。應該定義一個持久性更好的機制,比如核心對象和視窗句柄等。
若要確保進程I D或執行緒I D不被重複使用,唯一的方法是保證進程或執行緒的核心對象不會被撤消。如果剛剛創建了一個新進程或執行緒,只要不關閉這些對象的句柄,就能夠保證進程對象不被撤消。一旦應用程式結束使用該I D,那么調用C l o s e H a n d l e就可以釋放核心對象,要記住,這時使用或依賴進程I D,對來說將不再安全。如果使用的是子進程,將無法保證父進程或父執行緒的有效性,除非父進程複製了它自己的進程對象或執行緒對象的句柄,並讓子進程繼承這些句柄。

其他程式語言聲明

易語言

.版本 2
.數據類型 PROCESS_INFORMATION, , 進程信息
.成員 hProcess, 整數型, , , 進程號
.成員 hThread, 整數型, , , 執行緒號
.成員 dwProcessId, 整數型, , , 進程ID
.成員 dwThreadId, 整數型, , , 執行緒ID

熱門詞條

聯絡我們