我正在寻找更方便的方法来处理std::StringRust中的winapi调用.
使用生锈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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为,这种基于矢量的内存分配相当奇怪.所以我正在寻找更简单的投射LPCWSTR方式std::String
我发现了一种不寻常的行为std::default.如果使用默认设置器创建嵌套结构并尝试使用默认参数创建最高级别结构,则会导致堆栈溢出.
此代码编译,但当您尝试运行它时抛出thread '<main>' has overflowed its stack:
use std::default;
pub struct A {
x: i32
}
impl Default for A {
fn default() -> A {
A { ..Default::default() }
}
}
fn main() {
let test = A { ..Default::default() };
}
Run Code Online (Sandbox Code Playgroud)
但是如果设置了props继承的默认值,它的工作原理如下:
use std::default;
pub struct A {
x: i32
}
impl Default for A {
fn default() -> A {
A { x: 0 }
}
}
fn main() {
let test = …Run Code Online (Sandbox Code Playgroud)