Tôi đang tìm cách thuận tiện hơn để làm việc với std::String
trong các cuộc gọi winapi trong Rust.Cách thuận tiện hơn để làm việc với các chuỗi trong các cuộc gọi winapi
Sử dụng gỉ v 0.12.0-nigtly với WINAPI 0.1.22 và user32-sys 0.1.1
Bây giờ tôi đang sử dụng một cái gì đó như thế này:
use winapi;
use user32;
pub fn get_window_title(handle: i32) -> String {
let mut v: Vec<u16> = Vec::new();
v.reserve(255);
let mut p = v.as_mut_ptr();
let len = v.len();
let cap = v.capacity();
let mut read_len = 0;
unsafe {
mem::forget(v);
read_len = unsafe { user32::GetWindowTextW(handle as winapi::HWND, p, 255) };
if read_len > 0 {
return String::from_utf16_lossy(Vec::from_raw_parts(p, read_len as usize, cap).as_slice());
} else {
return "".to_string();
}
}
}
Tôi nghĩ rằng, đó vector này phân bổ bộ nhớ dựa trên khá kỳ quái. Vì vậy, tôi đang tìm cách dễ dàng hơn để truyền LPCWSTR
tới std::String
Tôi không có câu trả lời (tôi không quen với Rust) nhưng tôi sẽ đoán rằng 'i32' là số nguyên 32 bit. 'HWND' (và trên thực tế, tất cả các xử lý) là con trỏ, do đó, điều này có thể phá vỡ trên Windows 64 bit; nếu không phải bây giờ, thì tại một thời điểm nào đó trong tương lai. Bạn nên sử dụng số nguyên có kích thước con trỏ nếu bạn không muốn hiển thị trực tiếp loại 'HWND'. – andlabs
'i32' hoặc có thể' i64' ở đây được sử dụng để dễ dàng chuyển toàn bộ 'HWND' qua' Arc' và đồng bộ hóa chuỗi dễ dàng hơn. Nhưng đó không phải là vấn đề. – Cherrionella
@DavidHeffernan: 'str' không có bảo đảm đột biến (im-), giống như' u8' không có bảo đảm, nó chỉ là một kiểu. [Nó hoàn toàn có thể có một '& mut str', không chỉ có nhiều công dụng cho nó] (https://github.com/rust-lang/rust/pull/26241). Loại 'Chuỗi' là [chắc chắn có thể thay đổi] (https://doc.rust-lang.org/nightly/collections/string/struct.String.html#method.push). –