《windows核心編程》裏提到了“僞句柄”一詞,故名思議,它並不是真的句柄,有時候不會達到你想要的效果。邊看代碼,邊解釋
代碼如下:
這段代碼的意圖,是要在 ChildThread 這個線程函數裏獲得其父線程的一些時間參數(例如:創建時間,結束時間,執行用戶代碼所需要的時間等等) ,因此,在父線程裏,通過 GetCurrentThread() 函數,獲得當前線程的句柄,並作爲子線程函數的參數傳遞
代碼是這句:HANDLE hThreadC = (HANDLE)_beginthreadex(NULL,0,(unsigned (_stdcall*)( void*))ChildThread,(PVOID)hThreadParent,0,0);
然後在子線程裏,接收 父線程的句柄,用GetThreadTimes(hThreadParent,&ftCreationTime,&ftExitTime,&ftKernelTime,&ftUserTime)
獲得相應的時間參數。但是輸出結果並不是我們想要的 父線程的時間參數,而是子線程的時間參數,因爲我們傳遞的是一個 “僞句柄”,而線程的僞句柄是一個指向當前線程的句柄;換言之,指向的是發出函數調用的那個線程!
要想獲得真句柄,很簡單,只需要用我們 註釋的代碼,換掉 GetCurrentThread() ,正確代碼如下:
DuplicateHandle()函數獲得一個進程表中的記錄項,在另一個進程的句柄表中創建這個記錄項的副本。