Ton*_*ony 1 winapi rust windows-rs
在文档中有一个结构“IDesktopWallpaper”,其方法名为“GetWallpaper”。该方法引用“self”,但没有“IDesktopWallpaper”的构造函数方法。
use windows::{
core::*,
Win32::UI::Shell::IDesktopWallpaper,
};
fn main() -> Result<()> {
unsafe {
// ?????
IDesktopWallpaper::GetWallpaper(&self, monitorid);
}
Ok(())
}
Run Code Online (Sandbox Code Playgroud)
为了达到我想要的结果,我应该做什么?
COM一般使用工厂方法来构造COM对象。经典 COM 的“标准”工厂方法是CoCreateInstance. 它需要一个标识特定实现的类 ID(如果有多个实现)和一个命名所请求接口的接口 ID。
Windows crate 公开的类 ID 与 Windows SDK 不同:后者经常使用- 前缀,而CLSID_前者则不使用。Windows crate 中的 GUID 与Windows SDK 中的DesktopWallpaperGUID 相同。CLSID_DesktopWallpaper
另一个区别是,CoCreateInstance在 Windows crate 中,其返回的接口类型是通用的(而不是void*在 Windows SDK 中获取类型擦除的地址)。客户端需要明确命名他们请求的接口类型。
以下代码初始化 COM(必需),实例化 COM 对象,并返回一个IDesktopWallpaper接口以供进一步使用:
use windows::{
core::Result,
Win32::{
System::Com::{CoCreateInstance, CoInitialize, CLSCTX_ALL},
UI::Shell::{DesktopWallpaper, IDesktopWallpaper},
},
};
fn main() -> Result<()> {
// Initialize COM
unsafe { CoInitialize(None) }?;
// Create a DesktkopWallpaper object and return its IDesktopWallpaper interface
let wallpaper: IDesktopWallpaper =
unsafe { CoCreateInstance(&DesktopWallpaper, None, CLSCTX_ALL) }?;
// Use the COM object
unsafe { wallpaper.GetWallpaper(...) };
Ok(())
}
Run Code Online (Sandbox Code Playgroud)
您的Cargo.toml文件中需要包含以下内容:
[dependencies.windows]
version = "0.42.0"
features = [
"Win32_UI_Shell",
"Win32_System_Com",
]
Run Code Online (Sandbox Code Playgroud)