C ++如果目标进程未打开,则获取进程ID获取本地ID

时间:2016-03-09 23:13:00

标签: c++

#include <windows.h>
#include <tlhelp32.h>
#include <iostream>

using namespace std; 

void GetProcId();

DWORD ProcId = 0;

int main()
{

GetProcId();
printf("%d", ProcId);
cin.get();
return 0;
}

void GetProcId()
{
    PROCESSENTRY32   pe32;
    HANDLE         hSnapshot = NULL;

    pe32.dwSize = sizeof( PROCESSENTRY32 );
    hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );

    if( Process32First( hSnapshot, &pe32 ) )
    {
        do{
            if( strcmp( pe32.szExeFile, "s.exe" ) == 0 )
                break;
        }while( Process32Next( hSnapshot, &pe32 ) );
    }

    if( hSnapshot != INVALID_HANDLE_VALUE )
        CloseHandle( hSnapshot );

    ProcId = pe32.th32ProcessID;
}

工作,但当进程&#34; s.exe&#34;没有打开它抓住自己的进程ID,我真的不太确定如何解决这个问题。 非常感谢帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

这段代码:

    do{
        if( strcmp( pe32.szExeFile, "s.exe" ) == 0 )
            break;
    }while( Process32Next( hSnapshot, &pe32 ) );

将遍历所有进程,直到找到s.exe或Process32Next返回false。在后一种情况下,似乎没有定义pe32的状态。它可能会保持不变并参考列表中的最后一个流程,但我不愿意为此付钱。

之后

ProcId = pe32.th32ProcessID;

将使用pe32中的进程ID,无论它是否有效。

我建议进行以下修改:

DWORD GetProcId() // now returns the process ID. Why mess around with globals?
{
    PROCESSENTRY32   pe32;
    HANDLE         hSnapshot = NULL;
    DWORD pid = 0; // initialize to impossible pid

    pe32.dwSize = sizeof( PROCESSENTRY32 );
    hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 );
    // should probably check for hSnapshot != INVALID_HANDLE_VALUE right about here
    if( Process32First( hSnapshot, &pe32 ) )
    {
        do{
            if( strcmp( pe32.szExeFile, "s.exe" ) == 0 )
            {
                pid = pe32.th32ProcessID;
                break;
            }
        }while( Process32Next( hSnapshot, &pe32 ) );
    }

    if( hSnapshot != INVALID_HANDLE_VALUE )
        CloseHandle( hSnapshot );

    return pid;
}

Zero selected because you can't get a pid of zero in Windows.

用法:

int main()
{
    cout << GetProcId();
    return 0;
}