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

问题描述 投票:0回答:1

我正在使用 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)};
winapi rust windows-rs
1个回答
11
投票

关于字符串,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() 实施。

© www.soinside.com 2019 - 2024. All rights reserved.