Win API:之GetCurrentThreadGetCurrentThreadIdGetCurrentProcessGetCurrentProcessId
Posted 我来乔23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Win API:之GetCurrentThreadGetCurrentThreadIdGetCurrentProcessGetCurrentProcessId相关的知识,希望对你有一定的参考价值。
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 main(void) { 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:之GetCurrentThreadGetCurrentThreadIdGetCurrentProcessGetCurrentProcessId的主要内容,如果未能解决你的问题,请参考以下文章