You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将LPWSTR转换为Rust中的&str或String并打印?

将LPWSTR(*mut u16)转换为Rust字符串并打印

LPWSTR是Windows平台的宽字符串指针(以\0结尾的u16数组),要转成Rust的&str或String,需要分步骤安全处理,以下是具体实现方案:

核心处理逻辑

  1. 空指针检查:LPWSTR允许为null,必须先判断避免非法内存访问
  2. 提取宽字符串切片:从指针中取出以\0终止的u16切片
  3. 转成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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:25:31