我正在使用winapi來抓取系統中當前運行的行程串列,以下是我的代碼:
我正在使用winapi來抓取系統中當前運行的行程串列。
use winapi::um::tlhelp32::{Process32Next, Process32First, CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, PROCESSENTRY32};
使用winapi::um::winnt::HANDLE。
使用 winapi::um::handleapi::CloseHandle。
use std::mem::size_of;
...
fn get_processes() {
let h_process_snap: HANDLE;
//真的嗎,銹?
let mutpe32 = &mut PROCESSENTRY32{
dwSize。0,
cntUsage: 0,
th32ProcessID: 0,
th32DefaultHeapID: 0,
th32ModuleID: 0,
cntThreads: 0,
th32ParentProcessID: 0,
pcPriClassBase: 0,
dwFlags。0,
szExeFile: [0; 260]。
};
unsafe {
h_process_snap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)。
}
pe32.dwSize = size_of::<PROCESSENTRY32>() as u32;
unsafe {
if Process32First(h_process_snap, pe32) == 0 {
CloseHandle(h_process_snap)。
println!("無法獲得行程快照")。
// TODO: return。
}
while Process32Next(h_process_snap, pe32) != 0 {
println!("{:?}", pe32.szExeFile) 。
}
}
}
...
現在我試圖列印行程的實際名稱,在C 中,這可以用cout或wcout來完成。
當我使用println!("{:?}", pe32.szExeFile);時,我得到的是這樣的結果:
[115, 117, 112, 101, 114, 102, 52, 45, 114, 117, 115, 116, 46, 101, 120, 101, 0, 116, 46, 101, 120, 101, 0, 98, 108, 101, 83, 104, 101, 108, 108, 46, 69, 120, 112, 101, 114, 105, 101, 110, 99, 101, 115, 46, 84, 101, 120, 116, 73, 110, 112, 117, 116, 46, 73, 110, 112, 117, 116, 65, 112, 112, 46, 101, 120, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
我不太明白如何處理這個問題,我怎樣才能把pe32.szExeFile列印成rust中的Unicode字串?
也請看。https://docs.rs/winapi/0.3.6/winapi/um/tlhelp32/struct.PROCESSENTRY32.html
uj5u.com熱心網友回復:
感謝@IInspectable,我使用了明確的Unicode版本,例如Process32FirstW,以及from_wide,以可讀格式列印值:
let os_string = OsString::from_wide(&pe32.szExeFile[.])。
//ExeFile名稱有很多尾部的0,移除它們...。
let exe_files: String = os_string.into_string().unwrap() 。 replace("u{0}", "") 。
println!("{:?}", exe_files) 。
uj5u.com熱心網友回復:
你的陣列看起來像是一個可以表示為[u8;260]的陣列。這告訴我,你可以通過使用as將每個元素轉換為其字符表示:
fn main() {
let some_string: [u8; 260] = [115, 117, 112, 101, 114, 102, 52, 45, 114, 117, 115, 116, 46, 101, 120, 101, 0, 116, 46, 101, 120, 101, 0, 98, 108, 101, 83, 104, 101, 108, 108, 46, 69, 120, 112, 101, 114, 105, 101, 110, 99, 101, 115, 46, 84, 101, 120, 116, 73, 110, 112, 117, 116, 46, 73, 110, 112, 117, 116, 65, 112, 112, 46, 101, 120, 101, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 。
//在readable_string中把some_string中的每個u8表示為一個char。
let readable_string: [char;260] = some_string.map(|x| x as char) 。
for c in readable_string.iter().enumerate() {
let (i, val): (usize, & char) = c;
//注意,有些字符是'u{0}',可以被替換掉。
//用一個空格代替。
match val {
'u{0}' => print! (" ")。
_ => print!("{}"/span>, val)
};
}
}
以上產生的輸出結果如下:
superf4-rust.exe t.exe bleShell.Experiences.TextInput.InputApp.exe
這是你想做的嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/320278.html
標籤:
