EnumProcesses 无法更新 Vector

问题描述 投票:0回答:1

我正在尝试使用 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
示例中的示例。我也关注了chuondonglonami的博客。他们使用不同的板条箱,但对
EnumProcesses
的调用具有相同的签名。

windows winapi rust psapi
1个回答
5
投票

您正在创建容量为 1024 的向量。您为

EnumProcesses
提供了要写入的内存。然后你计算写入的元素个数——但是没人告诉可怜的
Vec
,所以它仍然认为它没有元素。

使用

set_len
告诉
Vec
它现在包含初始化元素。

© www.soinside.com 2019 - 2024. All rights reserved.