使用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
相关产品推荐
相关产品推荐

