如何将LPWSTR转换为Rust中的&str或String并打印?
将LPWSTR(*mut u16)转换为Rust字符串并打印
LPWSTR是Windows平台的宽字符串指针(以\0结尾的u16数组),要转成Rust的&str或String,需要分步骤安全处理,以下是具体实现方案:
核心处理逻辑
- 空指针检查:LPWSTR允许为
null,必须先判断避免非法内存访问 - 提取宽字符串切片:从指针中取出以
\0终止的u16切片 - 转成Rust字符串:通过
OsString中转(兼容Windows非UTF-8字符),再转为String
代码实现
基础版本(手动计算长度)
use std::ffi::OsString; use std::os::windows::ffi::OsStringExt; use winapi::um::winnetwk::NETRESOURCEW; fn main() { // 假设nr是你已获取的NETRESOURCEW实例 let nr: NETRESOURCEW = /* 你的NETRESOURCEW实例 */; let remote_name_ptr = nr.lpRemoteName; // 检查指针是否为空 if remote_name_ptr.is_null() { println!("远程名称为空"); return; } // 手动遍历到null终止符,计算字符串长度 let mut len = 0; unsafe { while *remote_name_ptr.add(len) != 0 { len += 1; } } // 从指针创建u16切片 let wide_slice = unsafe { std::slice::from_raw_parts(remote_name_ptr, len) }; // 转换为OsString再转为String let os_string = OsString::from_wide(wide_slice); match os_string.into_string() { Ok(remote_name) => println!("远程名称: {}", remote_name), Err(invalid_os_str) => println!("转换失败: {:?}", invalid_os_str), } }
优化版本(调用Windows API计算长度)
用Windows原生的lstrlenW函数直接获取宽字符串长度,效率更高:
use std::ffi::OsString; use std::os::windows::ffi::OsStringExt; use winapi::um::winnetwk::NETRESOURCEW; use winapi::um::stringapiset::lstrlenW; fn main() { let nr: NETRESOURCEW = /* 你的NETRESOURCEW实例 */; let remote_name_ptr = nr.lpRemoteName; if remote_name_ptr.is_null() { println!("远程名称为空"); return; } // 调用lstrlenW获取宽字符串长度 let len = unsafe { lstrlenW(remote_name_ptr) }; let wide_slice = unsafe { std::slice::from_raw_parts(remote_name_ptr, len as usize) }; let os_string = OsString::from_wide(wide_slice); match os_string.into_string() { Ok(remote_name) => println!("远程名称: {}", remote_name), Err(invalid_os_str) => println!("转换失败: {:?}", invalid_os_str), } }
关键注意点
- 所有操作原始指针的代码必须放在
unsafe块中,Rust无法保证指针指向的内存有效 - 必须确保LPWSTR指向的内存是以
\0结尾的,否则会触发越界内存读取 - 转换
String可能失败(比如宽字符串包含无法转成UTF-8的字符),必须处理错误分支
内容的提问来源于stack exchange,提问作者NikoBosko
相关产品推荐
相关产品推荐

