如何获取创建的进程的句柄或PID?

问题描述 投票:0回答:1

我需要获取新创建进程的句柄。

OpenProcess()
有一个
HANDLE
返回类型。但这需要一个过程
PID
。我来到这段代码:

STARTUPINFOW SI = { sizeof(SI) };
PROCESS_INFORMATION PI;

DWORD PID = ::CreateProcessW(L"Dummy", NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &SI, &PI);
HANDLE hDummy = ::OpenProcess(PROCESS_ALL_ACCESS, TRUE, PID);

但是,因为

CreateProcessW()
的返回类型是 bool,所以它当然会在
PID
变量中给我垃圾。

我尝试将

CreateProcessW
作为
PID
传递:

HANDLE hDummy = ::OpenProcess(PROCESS_ALL_ACCESS, TRUE, ::CreateProcessW(L"Dummy", NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &SI, &PI));

那也不起作用。它在两个方面都给我 0。

我还尝试将

PI.hProcess
传递给函数。在
CreateProcessW()
之后,所有
PI
的成员的值为0

c++ windows winapi pid handle
1个回答
0
投票

您可以通过对进程进行快照并比较进程名称来获取PID。 这是一个示例:

DWORD GetProcessIDByName(LPCTSTR szProcessName)
{
    STARTUPINFO st;
    PROCESS_INFORMATION pi;
    PROCESSENTRY32 ps;
    HANDLE hSnapshot;
    DWORD dwPID = 0;
    ZeroMemory(&st, sizeof(STARTUPINFO));
    ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
    st.cb = sizeof(STARTUPINFO);
    ZeroMemory(&ps, sizeof(PROCESSENTRY32));
    ps.dwSize = sizeof(PROCESSENTRY32);
    hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hSnapshot == INVALID_HANDLE_VALUE)
    {
        return dwPID;
    }
    if (!Process32First(hSnapshot, &ps))
    {
        return dwPID;
    }
    do
    {
        if (lstrcmpi(ps.szExeFile, szProcessName) == 0)
        {
            
            dwPID = ps.th32ProcessID;
        }
    } while (Process32Next(hSnapshot, &ps));
    
    CloseHandle(hSnapshot);
    return dwPID;
}

然后使用它:

DWORD pId = GetProcessIDByName("xxx.exe");

更多信息,您可以参考拍照查看进程

© www.soinside.com 2019 - 2024. All rights reserved.