#进程 #winapi #命令 #api绑定 #create-process-ex-w

CreateProcessW

使用Win32 API在Windows上创建和处理进程

1个不稳定版本

0.1.4 2024年4月14日
0.1.3 2023年6月18日
0.1.2 2021年11月25日
0.1.1 2021年11月21日
0.1.0 2021年11月18日

#113Windows API

Download history 2/week @ 2024-05-31 1/week @ 2024-06-07 15/week @ 2024-06-28 2/week @ 2024-07-19 4/week @ 2024-07-26

每月下载量 266次

MIT/Apache

28KB
192

CreateProcessW

actions status crate version documentation dependencies status licenses

该crate提供了一个类似于std::process的API,通过windows-rs crate使用Win32 API在Windows上创建和处理进程(参见此示例)。

它与std::process::Command的主要区别在于它允许运行命令字符串,而不是必须分别传递命令可执行文件和参数。

这相当于运行

std::process::Command::new("cmd.exe")
    .arg("/c")
    .arg("any_command_string")
    .spawn().expect("cannot spawn command");

唯一的区别是,Child实例将使用命令的PID而不是cmd.exe的PID。这很重要,因为如上代码中调用.kill()不会按预期工作,因为它会杀死cmd.exe的PID而不是实际运行的命令。

用法

将以下内容添加到您的Cargo.toml

[dependencies]
CreateProcessW = "0.1.0"

该crate不遵循Rust的命名建议。如果您想与其他导入的crate保持一致,请使用以下内容

[dependencies]
create_process_w = { version = "0.1.0", package = "CreateProcessW" }

创建命令

Command结构用于配置和启动进程

use CreateProcessW::Command;

let command = Command::new("cargo.exe clippy -- -D warnings")
    .inherit_handles(true)
    .current_dir(r"C:\Users\<user>\repos\<repo_name>");

启动进程

spawn函数启动进程,并返回一个表示已启动子进程的Child

use CreateProcessW::Command;

let child = Command::new("notepad.exe")
    .spawn()
    .expect("notepad failed to start");


std::thread::sleep(std::time::Duration::from_secs(2));

child.kill().expect("cannot kill process");
let status = child.wait().expect("cannot wait process");

if status.success() {
    println!("Success!");
} else {
    println!("Process exited with status {}", status.code());
}

status函数启动子进程,等待其完成并返回其ExitStatus

use CreateProcessW::Command;

let status = Command::new("notepad.exe")
    .status()
    .expect("notepad failed to start");

if status.success() {
    println!("Success!")
} else {
    println!("Process exited with status {}", status.code())
}

依赖项

~128MB
~2M SLoC