You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用EXTENDED_STARTUPINFO_PRESENT时CreateProcessW调用失败咨询

问题解答

EXTENDED_STARTUPINFO_PRESENT 并非仅兼容 STARTUPINFOEXA,你的 TestFunctionW() 调用失败是因为未正确初始化 STARTUPINFOEXW 的 cbSize 成员。

Windows API 中,所有带 cbSize 的结构体都需要显式设置该字段,让API明确结构体的内存大小,否则会因参数校验失败返回错误码87(参数不正确)。你的 TestFunctionA() 能运行只是巧合(比如结构体初始化为0后,内存布局刚好让API误判了大小,但这属于不可靠的行为)。

修正后的 TestFunctionW() 代码如下:

void TestFunctionW()
{
    STARTUPINFOEXW startup_info = { 0 };
    PROCESS_INFORMATION process_info = { 0 };

    // 关键:设置正确的结构体大小
    startup_info.StartupInfo.cbSize = sizeof(STARTUPINFOEXW);

    std::wstring cmd(L"ping.exe");
    BOOL ret = CreateProcessW(NULL, (LPWSTR)cmd.c_str(), NULL, NULL, FALSE, EXTENDED_STARTUPINFO_PRESENT, NULL, NULL, (LPSTARTUPINFOW)&startup_info, &process_info);
    if (!ret)
    {
        DWORD err = GetLastError();
        std::cout << "Failed: code " << err << std::endl;
    }
    else
    {
        // 别忘了关闭进程和线程句柄避免资源泄漏
        CloseHandle(process_info.hThread);
        CloseHandle(process_info.hProcess);
    }
}

同样,TestFunctionA() 也应该补充设置 startup_info.StartupInfo.cbSize = sizeof(STARTUPINFOEXA);,避免后续出现潜在问题。

补充说明

  • STARTUPINFOEXA 和 STARTUPINFOEXW 分别对应ANSI和Unicode版本的扩展启动信息结构体,EXTENDED_STARTUPINFO_PRESENT 标志对两者完全兼容。
  • 错误码87(ERROR_INVALID_PARAMETER)的常见触发场景包括:结构体大小未正确设置、传入的标志位与结构体类型不匹配、参数值超出合法范围等。

内容的提问来源于stack exchange,提问作者Warpin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 18:23:02