无法使用CreateProcessW创建进程

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

我需要创建一个进程并获取它的句柄和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.

c++ windows winapi pid handle
1个回答
0
投票
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
进行比较并不是一个好主意。

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