Winapi 为什么调用SystemParametersInfo from Rust将墙纸设置为黑色?

Winapi 为什么调用SystemParametersInfo from Rust将墙纸设置为黑色?,winapi,rust,wallpaper,Winapi,Rust,Wallpaper,我试图使用winapi板条箱和SystemParametersInfo将Windows背景设置为Rust,但它将背景设置为黑色。在C++中,这通常意味着PVPARAM没有正确传递,或者它的类型错误。 怎么了 [cfgwindows] 外部机箱winapi; 使用winapi::ctypes::c_void; 使用winapi::um::winuser:{SystemParametersInfoA,SPIF_UpdateInFile,SPI_SetDeskWallper}; fn干线{ 让mut

我试图使用winapi板条箱和SystemParametersInfo将Windows背景设置为Rust,但它将背景设置为黑色。在C++中,这通常意味着PVPARAM没有正确传递,或者它的类型错误。 怎么了

[cfgwindows] 外部机箱winapi; 使用winapi::ctypes::c_void; 使用winapi::um::winuser:{SystemParametersInfoA,SPIF_UpdateInFile,SPI_SetDeskWallper}; fn干线{ 让mut image_path=图像的路径; 设映像路径为:*mut c_void=&mut映像路径为*mut*as*mut c_void; 不安全{ 系统参数SINFOA SPI_Setdesk壁纸, 0, 图像路径, SPIF_更新文件, ; } }
锈蚀字符串不是C字符串。您应该改为使用来与C代码接口:

使用std::ffi::CString; //使用。。。 fn干线{ 让mut image_path=CString::newPath to image.unwrap; 不安全{ 系统参数SINFOA SPI_Setdesk壁纸, 0, 图像_path.as_ptr as*mut c_void, SPIF_更新文件, ; } } 详细说明:image_path是一个胖指针(&str)。通过对它进行可变引用,您将获得一个&mut&str。然后将其传递给C,C将取消对指针的引用并获得一个&str

但是C代码不知道如何处理锈迹类型:它只知道C字符串,而期望一个指向第一个字节的指针。它还希望字符串以NUL结尾,而Rust字符串则不是。因此,在这种情况下,将Rust&str代码传递给C代码是没有意义的,这正是CStr和CString存在的原因。

这是我最后的工作代码:

[cfgwindows] 外部机箱winapi; 使用std::ffi::CString; 使用winapi::ctypes::c_void; 使用winapi::um::winuser:{SystemParametersInfoA,SPIF_UpdateInFile,SPI_SetDeskWallper}; fn干线{ 让mut image_path=CString::newPath to image.unwrap; 不安全{ 系统参数SINFOA SPI_Setdesk壁纸, 0, 图像_path.as_ptr as*mut c_void, SPIF_更新文件, ; } }
嘿,谢谢。现在可以了。您的CString类型有点错误,我在问题中添加了工作代码。另一个问题,您是否知道我是否可以使用SystemParametersInfo单独设置不同屏幕的背景?抱歉,我没有真正使用WINAPI,因此无法对其细节进行评论。至于类型,我认为CStr应该可以工作,因为你有一个静态字符串,不是吗?编译器抱怨你在使用你的代码。我查阅了CStr文档,示例是使用CString::newOh您正在谈论的&mut&str不是&str,好的,仍然可以使用&str,但这不是您真正的问题,但是已经有一个用于设置墙纸的板条箱,您可以查看:嘿,谢谢,我会看看这个,因为我仍然需要弄清楚如何设置不同显示器的墙纸编辑:啊该死的板条箱只支持一个显示器以及。。。