我正在使用 windows crate 中的
IDesktopWallpaper::SetWallpaper
方法。此方法的第二个参数是 PCWSTR
(指针),指向要设置为壁纸的图像的完整路径。问题是 PCWSTR
对象的类型是 *const u16
而不是 *const 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 时总会涉及到转换,而您最希望的是有一个可以为您完成此操作的 crate。
windows 箱不仅提供 Windows API 表面的 Rust 映射,还包含一个小型库,用于解决使用 Rust 进行 Windows 编程时的常见问题,其中包括字符串处理。在字符串处理上花了很多心思,结果可能看起来有些虎头蛇尾:所有字符串常量都可以表示为实例。
因此,HSTRING
是 Rust for Windows 中字符串转换的枢轴点。它的实现有一系列 Rust 字符串类型的 HSTRING
特征实现(我相信全部),以及
From
的所有其他 Windows 字符串类型的 From
实现。
在这种情况下,如果HSTRING
的类型为
path
,您可以从中构造一个 Path
并通过引用传递它。其他所有事情的发生都是由于隐式 HSTRING
特征调用(即
From
):
From<&HSTRING> for PCWSTR
v0.44.0+
v0.44.0(2023-01-12发布)引入了
unsafe { desktop.SetWallpaper(None, &HSTRING::from(path.as_os_str())) };
,让我们可以进一步简化代码:impl From<&Path> for HSTRING
这纯粹是为了方便。在内部,unsafe { desktop.SetWallpaper(None, &HSTRING::from(&path)) };
代表我们调用 From<&Path>
,然后委托给
as_os_str()
实施。