我需要创建一个进程并获取它的句柄和PID。
这是我的代码:
STARTUPINFOW SI;
PROCESS_INFORMATION PI;
SI.cb = sizeof(SI);
std::wstring Name = L"Dummy";
if (!::CreateProcessW(Name.c_str(), NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &SI, &PI))
{
std::wcout << L"Failed to create a process";
}
HANDLE hDummy = ::OpenProcess(PROCESS_ALL_ACCESS, TRUE, PI.dwProcessId);
在输出窗口中输出
"Failed to create a process"
。我在 Process Explorer 中看不到进程,并且 PI 的所有值仍然为 0。
它还给了我这个消息:
Exception thrown at 0x00007FFA5202C286 (ntdll.dll) in PEX.exe: 0xC0000005: Access violation reading location 0xFFFFFFFFFFFFFFFF.
PI.hProcess
这是进程的 handle - 这是
OpenProcess()
返回的值(但访问标志与 PROCESS_ALL_ACCESS
不同)。
PI.dwProcessId
这是进程的 ID - 这是您可以传递给
OpenProcess()
的值。
(...以及您似乎正在寻找的价值。)
PID = CreateProcess(...)
这将返回一个 boolean 值:如果进程已创建,则不等于
FALSE
;如果创建进程失败,则不等于 FALSE
。
如果该值为
FALSE
,则 PI.dwProcessId
和 PI.hProcess
包含 invalid 值。
请注意,Windows API 使用 (typedef-) 类型
BOOL
来存储布尔值(而不是类型 bool
),并使用大写常量 TRUE
和 FALSE
。另请注意,类型 BOOL
可以容纳多个值,并且任何不等于 FALSE
的值都表示“true”。因此,使用 == TRUE
进行比较并不是一个好主意。