我需要获取新创建进程的句柄。
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
您可以通过对进程进行快照并比较进程名称来获取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");
更多信息,您可以参考拍照查看进程。