LPPROCESS_INFORMATION

結構原型,相關知識,其他程式語言聲明,

結構原型

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的進程。

相關詞條

熱門詞條

聯絡我們