我正在尝试使用 Win32 (psapi) 提供的
EnumProcesses
函数枚举 Windows 进程。生活很顺利,所以我使用 Rust 而不是 C++。代码如下。
Cargo.toml
[dependencies.windows]
features = [
"Win32_Foundation",
"Win32_System_ProcessStatus"
]
main.rs
use windows::Win32::System::ProcessStatus::*;
fn main() {
unsafe{
let mut cb_needed: u32 = 0;
let mut a_processes: Vec<u32> = Vec::with_capacity(1024);
let result: windows::Win32::Foundation::BOOL = EnumProcesses(a_processes.as_mut_ptr(), 1024*4, &mut cb_needed);
let mut _c_processes: u32 = 0;
_c_processes = cb_needed / 4;
println!("{:?}",_c_processes);
let mut count: u32 = 0;
while count < _c_processes {
println!("{:?}",a_processes[count as usize]);
count += 1;
}
}
}
当我调试代码时,变量
a_processes
显示长度为零。然而,变量 cb_needed
(根据 Microsoft 文档显示返回的字节数)返回非零值(接近 200)。变量 result 的值为 1,如果操作成功,这是预期的。
当我尝试访问
a_processes[count as usize]
时,它因“索引越界”而失败。我尝试以管理员身份执行它,它仍然失败。任何想法,为什么 a_processes 没有用进程 ID 更新。
我正在从 Kenny Kerr 的入门指南中学习 Rust for Windows](https://kennykerr.ca/rust-getting-started/)。我浏览了Microsofts
windows-rs
示例中的示例。我也关注了chuondong和lonami的博客。他们使用不同的板条箱,但对 EnumProcesses
的调用具有相同的签名。
您正在创建容量为 1024 的向量。您为
EnumProcesses
提供了要写入的内存。然后你计算写入的元素个数——但是没人告诉可怜的Vec
,所以它仍然认为它没有元素。
set_len
告诉Vec
它现在包含初始化元素。