使用windows-rs调用CreateProcessW创建ConPty进程返回退出码3221225794
问题根源与修复方案
你的代码存在三个核心错误,直接导致控制台类程序启动失败:
1. 命令行参数传递格式错误
CreateProcessW的第二个参数lpCommandLine要求传入可变的、以0结尾的UTF-16宽字符串,你直接传入了Rust的普通字符串字面量,既没有转码为宽字符,也没有分配可写内存,系统读取/修改命令行参数时触发内存访问错误,直接导致DLL初始化失败(也就是你遇到的0xc0000142错误)。
2. 线程逻辑错误
你创建了两个完全相同的读file_out的线程,直接丢弃了子进程输入对应的file_in句柄,同时管道句柄的接管时机过早,在子进程创建前就转移到了子线程,导致子进程无法继承到有效的管道句柄。
3. 伪控制台资源未正确管理
你没有在子进程退出后释放HPCON伪控制台句柄,会造成资源泄漏,也可能引发后续的API调用异常。
修复示例
首先修正命令行参数传递:
// 将命令转成可变的、以0结尾的UTF-16数组 let mut cmd: Vec<u16> = "ping.exe".encode_utf16().chain(std::iter::once(0)).collect();
调用CreateProcessW时传入PWSTR(cmd.as_mut_ptr())作为第二个参数。
修正线程逻辑与句柄管理:
删除重复的读线程,新增标准输入写入线程,并且调整句柄接管的时机到CreateProcessW调用成功之后。
新增伪控制台释放逻辑:
在子进程退出后调用ClosePseudoConsole(h_pc)释放资源。
修复后重新编译运行,cmd、powershell、ping等控制台程序即可正常启动。
内容的提问来源于stack exchange,提问作者ibigbug
相关产品推荐
相关产品推荐

