• Win API:之GetCurrentThread、GetCurrentThreadId、GetCurrentProcess、GetCurrentProcessId


      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 "), 
                        pData->nVal1, 
                        pData->nVal2); 
        StringCchLength(msgBuf, BUF_SIZE, &cchStringSize);
        WriteConsole(hStdout, msgBuf, cchStringSize, &dwChars, 
    NULL);

        
    return 0

    }

  • 相关阅读:
    hd2068错排+组合
    POJ 1061 青蛙的约会 扩展欧几里得
    POJ 2115 C Looooops扩展欧几里得
    扩展欧几里得算法
    欧拉函数模板
    高精度模板
    快速幂模板
    HDU 4445 Crazy Tank 高中物理知识忘得差不多了
    POJ 3087 Shuffle'm Up 模拟,看着不像搜索啊
    HDU 4452 Running Rabbits 模拟
  • 原文地址:https://www.cnblogs.com/MakeView660/p/7755374.html
Copyright © 2020-2023  润新知