結構原型,相關知識,其他程式語言聲明,
結構原型
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。