gpt4 book ai didi

winapi - 使用 OsString 调用 winapi 并转换回 String

转载 作者:行者123 更新时间:2023-11-29 08:35:40 24 4
gpt4 key购买 nike

我正在努力调用 GetUserName 的宽字符版本。 UTF-8 调用有效,但可能有更好的方法:

#[cfg(windows)] extern crate advapi32;
#[cfg(windows)] extern crate winapi;

use std::ffi::CString;

fn get_user_name() -> String {
let mut sz: u32 = 64;
unsafe {
let mut username = CString::from_vec_unchecked(vec![0; sz as usize]);
let ptr = username.into_raw();
advapi32::GetUserNameA(ptr as *mut i8, &mut sz as *mut u32);
CString::from_raw(ptr).to_str().unwrap().to_owned()
}
}

然后我尝试了UTF-16版本。这有效但看起来不对,因为我必须为 OsStr::new() 创建这个空白字符串:

fn get_user_name() -> String {
// for windows
use std::ffi::OsStr;
let mut sz: u32 = 64;
let mut username = OsStr::new(" ")
.encode_wide()
.collect::<Vec<u16>>();
unsafe {
advapi32::GetUserNameW(username.as_mut_ptr() as *mut u16, &mut sz as *mut u32);
}
String::from_utf16(&username[..sz as usize]).unwrap()
}

我也试过使用 OsString::with_capacity(),但是这个崩溃了:

fn get_user_name() -> String {
// for windows
use std::ffi::OsStr;
let mut sz: u32 = 64;
let mut username = OsString::with_capacity(sz as usize)
.as_os_str()
.encode_wide()
.collect::<Vec<u16>>();
unsafe {
advapi32::GetUserNameW(username.as_mut_ptr() as *mut u16, &mut sz as *mut u32);
}
String::from_utf16(&username[..sz as usize]).unwrap()
}

Stack Overflow 上还有其他答案,其中 Rust 创建了一个字符串以传递给函数(例如 MessageBoxW),但没有一个答案的大小由 Windows 确定并且 Rust 必须分配要填充的空间稍后。

在 Rust 必须预分配缓冲区然后(最终)转换回标准 UTF-8 字符串的情况下,在 Windows 上调用宽字符函数的正确方法是什么?

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com