获取进程或线程的ID以及句柄信息
先介紹一下創建線程或進程的時候是可以得到相應的ID以及句柄信息的。
BOOL CreateProcess ( LPCTSTR lpApplicationName, LPTSTR lpCommandLine, LPSECURITY_ATTRIBUTES lpProcessAttributes, LPSECURITY_ATTRIBUTES lpThreadAttributes, BOOL bInheritHandles, DWORD dwCreationFlags, LPVOID lpEnvironment, LPCTSTR lpCurrentDirectory, LPSTARTUPINFO lpStartupInfo, LPPROCESS_INFORMATIONlpProcessInformation );其他的參數就不介紹了,最后一個參數lpProcessInformation指向一個用來接收新進程的識別信息的PROCESS_INFORMATION結構體。
typedef struct_PROCESS_INFORMATION{ HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; }PROCESS_INFORMATION;其中成員含義如下。
① hProcess:返回新進程的句柄。
② hThread:返回主線程的句柄。
③ dwProcessId:返回一個全局進程標識符。該標識符用于標識一個進程。從進程被創建到終止,該值始終有效。
④ dwThreadId:返回一個全局線程標識符。該標識符用于標識一個線程。從線程被創建到終止,該值始終有效。
最后一個參數 lpThreadId:保存新線程的id,返回值就是創建的新線程的句柄。
接下來說一下創建之后的情況
進程
HANDLE GetCurrentProcess(VOID);
說明:獲取當前進程的一個句柄
返回值:為當前進程的句柄,該句柄可以復制,但不可繼承。不必調用CloseHandle函數來關閉這個句柄。
注意:但是要注意的是,這個句柄只是一個偽句柄,只能在我們的進程中才能代表當前進程的句柄,事實上這個函數目前只是簡單的返回-1這個值。也就是說在我們的程序中-1便能表示本進程的句柄。
獲得進程真正的句柄,但是這時候獲取到的真正句柄需要關閉!
HANDLE?hProcess=NULL;???? DuplicateHandle(GetCurrentProcess(),????GetCurrentProcess(),????GetCurrentProcess(),????&hProcess,????0,????FALSE,????DUPLICATE_SAME_ACCESS);//偽進程句柄轉為真實進程句柄????DWORD GetCurrentProcessId(VOID);
說明:獲取當前進程的標示符(PID)
返回值:返回一個標示符(PID)
線程基本和進程是系統的相同的
HANDLE GetCurrentThread(VOID); //獲取線程偽句柄
DWORD GetCurrentThreadId(VOID); //獲取線程ID
轉換為真正的線程句柄
HANDLE?hThread=NULL;?? DuplicateHandle(GetCurrentProcess(),??GetCurrentThread(),??GetCurrentProcess(),??&hThread,??0,??FALSE,??DUPLICATE_SAME_ACCESS);//偽線程句柄轉換為真實線程句柄?? //..???? //不用時也必須關閉?? CloseHandle(hThread); ?
總結
以上是生活随笔為你收集整理的获取进程或线程的ID以及句柄信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql安装可能遇到的错误和安装过程
- 下一篇: libjpeg(1)