在檔案中有一個結構 'IDesktopWallpaper' 和一個名為 'GetWallpaper' 的方法。該方法參考了“self”,但沒有“IDesktopWallpaper”的構造方法。
use windows::{
core::*,
Win32::UI::Shell::IDesktopWallpaper,
};
fn main() -> Result<()> {
unsafe {
// ?????
IDesktopWallpaper::GetWallpaper(&self, monitorid);
}
Ok(())
}
我應該怎么做才能得到我想要的結果?
uj5u.com熱心網友回復:
COM 一般使用工廠方法來構造 COM 物件。經典 COM 的“標準”工廠方法是CoCreateInstance. 它需要一個標識特定實作(如果有多個)的類 ID 和一個命名所請求介面的介面 ID。
windows crate 公開的類 ID 與 Windows SDK 不同:后者經常使用CLSID_-prefixes,而前者不使用。DesktopWallpaperwindows crate 中的 GUID 與 Windows SDK 中的 GUID 相同CLSID_DesktopWallpaper。
另一個區別是,CoCreateInstancewindows 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(())
}
您需要在Cargo.toml檔案中包含以下內容:
[dependencies.windows]
version = "0.42.0"
features = [
"Win32_UI_Shell",
"Win32_System_Com",
]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/522549.html
下一篇:WIC中10位影像中的最大浮點值
