Win API:之GetCurrentThread、GetCurrentThreadId、GetCurrentProcess、GetCurrentProcessId
阿新 • • 發佈:2017-10-30
ssh include 系統 out value gin ica exit generate
如果用於其他進程需要用 DuplicateHandle 復制句柄;
GetCurrentProcess 返回的虛擬句柄可以通過 OpenProcess 創建一個真實的句柄. C++ Code
Win API:之GetCurrentThread、GetCurrentThreadId、GetCurrentProcess、GetCurrentProcessId
{返回當前線程的虛擬句柄} GetCurrentThread: THandle;
{返回當前線程 ID} GetCurrentThreadId: DWORD;
{返回當前進程的虛擬句柄} GetCurrentProcess: THandle;
{返回當前進程 ID} GetCurrentProcessId: DWORD;
提示:
ID 是系統唯一的標識.
所謂虛擬句柄, 就是該句柄只在調用進程的進程中有效, 也不能被繼承;
如果用於其他進程需要用 DuplicateHandle 復制句柄;
GetCurrentProcess 返回的虛擬句柄可以通過 OpenProcess 創建一個真實的句柄. C++ Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
#include <iostream> #include <Windows.h> #include <process.h> #include <tchar.h> #include <strsafe.h> #define BUF_SIZE 255 typedef struct MyData { int nVal1; int nVal2; } MYDATA, *PMYDATA; using namespace std; DWORD WINAPI MyThread( LPVOID lpParam ); int { HANDLE hProcess = NULL; DWORD dwProcessId = 0; HANDLE hThread = NULL; DWORD dwThreadId = 0; PMYDATA pData; hProcess = GetCurrentProcess(); //進程偽句柄 cout << "The Current Process Pseudo Handle is " << hProcess << endl; DuplicateHandle(GetCurrentProcess(), GetCurrentProcess(), GetCurrentProcess(), &hProcess, 0, FALSE, DUPLICATE_SAME_ACCESS ); cout << "The Current Process Real Handle is " << hProcess << endl; dwProcessId = GetCurrentProcessId(); cout << "The Current Process Id is " << dwProcessId << endl; // Allocate memory for thread data. pData = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MYDATA)); if( pData == NULL ) { ExitProcess(2); } // Generate unique data for each thread. pData->nVal1 = 1; pData->nVal2 = 100; // Create Thread hThread = CreateThread( NULL, // default security attributes 0, // use default stack size MyThread, // thread function pData, // argument to thread function 0, // use default creation flags &dwThreadId); // returns the thread identifier cin.get(); return 0; } DWORD WINAPI MyThread( LPVOID lpParam ) { HANDLE hThread = NULL; DWORD dwThreadId = 0; hThread = GetCurrentThread(); //線程偽句柄 cout << "The Current Thread Pseudo Handle is " << hThread << endl; DuplicateHandle(GetCurrentProcess(), GetCurrentThread(), GetCurrentProcess(), &hThread, 0, FALSE, DUPLICATE_SAME_ACCESS ); cout << "The Current Thread Real Handle is " << hThread << endl; dwThreadId = GetCurrentThreadId(); cout << "The Current Thread Id is " << dwThreadId << endl; HANDLE hStdout; PMYDATA pData; TCHAR msgBuf[BUF_SIZE] = {0}; size_t cchStringSize; DWORD dwChars; hStdout = GetStdHandle(STD_OUTPUT_HANDLE); if( hStdout == INVALID_HANDLE_VALUE ) return 1; // Cast the parameter to the correct data type. pData = (PMYDATA)lpParam; // Print the parameter values using thread-safe functions. StringCchPrintf(msgBuf, BUF_SIZE, TEXT("Parameters = %d, %d\n"), pData->nVal1, pData->nVal2); StringCchLength(msgBuf, BUF_SIZE, &cchStringSize); WriteConsole(hStdout, msgBuf, cchStringSize, &dwChars, NULL); return 0; } |
Win API:之GetCurrentThread、GetCurrentThreadId、GetCurrentProcess、GetCurrentProcessId