【发布时间】:2015-06-16 20:19:31
【问题描述】:
我正在寻找在 Rust 的 winapi 调用中使用 std::String 的更方便的方法。
将 rust v 0.12.0-nigtly 与 winapi 0.1.22 和 user32-sys 0.1.1 一起使用
现在我正在使用这样的东西:
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();
}
}
}
我认为,这种基于向量的内存分配相当奇怪。所以我正在寻找更简单的方法将LPCWSTR 转换为std::String
【问题讨论】:
-
我没有答案(我不熟悉 Rust),但我猜
i32是一个 32 位整数。HWNDs(事实上,所有句柄)都是指针,所以这可能会在 64 位 Windows 上中断;如果不是现在,那么在未来的某个时候。如果您不想直接公开HWND类型,则应该使用指针大小的整数。 -
i32或i64用于更轻松地通过Arc传输全局HWND和更轻松的线程同步。但这不是问题。 -
@DavidHeffernan:
str没有(im-)可变性保证,就像u8没有保证一样,它只是一个类型。 It's entirely possible to have a&mut str, there just aren't that many uses for it。String类型是 definitely mutable。