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

调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:04:54