如何从路径或字符串中获取"PCWSTR"对象?



我使用的是windows机箱中的IDesktopWallpaper::SetWallpaper方法。该方法的第二个参数是指向要设置为壁纸的图像的完整路径的PCWSTR(指针(。问题是PCWSTR对象的类型是*const u16而不是*const String。如何从Path/String获取PCWSTR对象?

let path = "Path_to_image.jpg".to_string();
let ptr = &path as *const String;
let wallpaper = PCWSTR::from_raw(ptr); 
//                               ^^^  expected raw pointer `*const u16` 
//                                         found raw pointer `*const String`
unsafe { desktop.SetWallpaper(None, wallpaper)};

当谈到字符串时,Rust和Windows可能会有更多的分歧。在Windows上使用Rust时总会涉及到转换,你所能希望的最好的是一个能为你做到这一点的板条箱。

windows机箱不仅为windows的API表面提供Rust映射,它还包含一个小型库,用于解决使用Rust编程windows时的常见问题,其中包括字符串处理。字符串处理有很多想法,结果可能有些虎头蛇尾:所有字符串常量都可以表示为HSTRING实例。

因此,HSTRING是Rust for Windows中字符串转换的支点。它的实现对Rust字符串类型的From特征实现(我相信全部都是(进行了检测,对HSTRING的所有其他Windows字符串类型进行了From实现。

在这种情况下,如果path的类型是Path,那么您可以简单地从中构造一个HSTRING,并通过引用传递它。其他一切都只是由于隐式From特征调用(即From<&HSTRING> for PCWSTR(而发生:

unsafe { desktop.SetWallpaper(None, &HSTRING::from(path.as_os_str())) };

最新更新