调用CreateProcessW创建进程失败,遇访问违例错误求助
问题分析与修复
核心错误
你调用CreateProcessW时第一个参数传了L"Dummy",这是完全错误的——这个参数需要传入可执行文件的完整路径(比如系统自带的记事本路径L"C:\\Windows\\notepad.exe"),系统找不到名为Dummy的可执行程序,所以进程创建失败,PROCESS_INFORMATION结构体的所有值保持为0,后续用无效的PI.dwProcessId(值为0)调用OpenProcess,直接触发了访问违规错误。
其他潜在问题
STARTUPINFOW和PROCESS_INFORMATION结构体没有初始化,只设置了SI.cb,剩余成员可能残留垃圾内存值,会干扰API调用。- 进程创建失败后没有获取具体错误码,无法精准定位问题。
- 其实
CreateProcess成功后,PROCESS_INFORMATION里已经包含了进程句柄PI.hProcess,不需要额外调用OpenProcess。
修复后的代码
#include <windows.h> #include <iostream> #include <string> int main() { STARTUPINFOW SI = { 0 }; // 直接初始化清零 PROCESS_INFORMATION PI = { 0 }; SI.cb = sizeof(SI); // 必须设置的结构体大小字段 // 替换为实际存在的可执行文件路径,这里用记事本示例 std::wstring exePath = L"C:\\Windows\\notepad.exe"; if (!::CreateProcessW( exePath.c_str(), NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &SI, &PI)) { // 输出具体错误码,方便排查 std::wcout << L"进程创建失败,错误码:" << ::GetLastError() << std::endl; return 1; } // 直接使用CreateProcess返回的进程句柄和PID std::wcout << L"进程创建成功,PID:" << PI.dwProcessId << std::endl; std::wcout << L"进程句柄:" << PI.hProcess << std::endl; // 记得用完句柄后关闭,避免资源泄漏 ::CloseHandle(PI.hProcess); ::CloseHandle(PI.hThread); return 0; }
关键改动说明
- 初始化结构体时直接用
= {0}清零,避免垃圾值干扰。 - 传入合法的可执行文件路径,确保系统能找到程序。
- 创建失败时调用
GetLastError()获取错误码,比如错误码2表示文件找不到,能快速定位问题。 - 直接使用
CreateProcess返回的PI.hProcess作为进程句柄,无需额外调用OpenProcess。 - 新增句柄关闭代码,避免系统资源泄漏。
内容的提问来源于stack exchange,提问作者cppu
相关产品推荐
相关产品推荐

