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


#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;
}

有效,但是当进程"s.exe"未打开时,它会获取自己的进程ID,我真的不太确定如何解决此问题。帮助将不胜感激,谢谢!

这段代码:

    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;
}

选择零是因为您无法在 Windows 中获得零 pid。

用法:

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

最新更新