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