Rust ffi winapi 读取宽字符串指针的功能补充

在使用Rust编写winapi相关功能时,常会遇到C++ 的 PWCHAR PSTR PWSTR PCHAR 等字符串指针类型的转换。

在Rust中可使用CStr::from_ptr 去正确转换为rust中的utf8字符串(Rust中字符串使用的内置编码一律是utf8),但是PWCHAR却不行,因为CStr::from_ptr入参类型为i8类型指针,而PWCHAR在winapi库中映射为*mut u16指针。还有个OsString::from_wide函数处理宽字节字符串,但入参则需要明确长度的u16数组才能转换,并不能使用不定长指针。故PWCHAR,PWSTR 这类宽字节字符串指针类型都没有很方便的转换方式。

至此只能自行实现转换函数

pub fn from_wide_ptr(ptr: *const u16) -> String {
    unsafe { 
        assert!(!ptr.is_null());
        let len = (0..std::isize::MAX).position(|i| *ptr.offset(i) == 0).unwrap(); //判断C字符串的长度。C字符串不论宽字节还是单字节字符串都是0结尾。
        let slice = std::slice::from_raw_parts(ptr, len); //转换为定长的数组片段
        OsString::from_wide(slice).to_string_lossy().into_owned()
    }
}