不知道如何使用 IDesktopWallpaper

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)

为了达到我想要的结果,我应该做什么?

IIn*_*ble 5

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)