关于函数指针参数获取值
use std::ptr;
use std::sync::atomic::{AtomicPtr, Ordering};
use winapi::shared::minwindef::BOOL;
use winapi::shared::windef::HWND;
use winapi::um::winuser::*;
use lazy_static::lazy_static;
lazy_static! {
static ref TITLE: AtomicPtr<String> = AtomicPtr::new(&mut String::from(""));
}
fn main() {
unsafe {
EnumWindows(Some(enum_window), 0isize);
let title = TITLE.load(Ordering::Relaxed);
println!("find:{:?}", ptr::read(title));
}
}
extern "system" fn enum_window(w: HWND, _: isize) -> BOOL {
unsafe {
let len = GetWindowTextLengthW(w)+1;
let mut title:[u16;512] = [0;512];
let real_len = GetWindowTextW(w, title.as_mut_ptr(),len);
let mut title_str = String::from_utf16_lossy(&title[..real_len as usize]);
if title_str.ends_with("main.rs") {
println!("title_str:{}",title_str);
TITLE.store(&mut title_str,Ordering::Relaxed);
return false.into();
}
return true.into();
}
}
代码如上,我需要遍历并查找指定窗口,当我查询到窗口后如何返回呢,目前是使用Atomic
实现,但这显然不是个好办法,求教一下应当怎么做。
另外,ptr::read(title)
会导致程序意外退出,但title
的内容也正常打印了,我不知道为什么
使用Mutex去保存
或者使用 ManuallyDrop 去包装你的返回值 要注意手动回收