use windows::{
Win32::{
System::Com::{CLSCTX_ALL, CoCreateInstance, CoTaskMemFree},
UI::Shell::{Common::ITEMIDLIST, IPersistIDList, IShellItem},
},
core::{Interface, Result},
};
use super::item::ShellItem;
pub trait PersistIDList {
fn new() -> Result<IPersistIDList>;
fn get_id_list(&self) -> Result<*mut ITEMIDLIST>;
fn to_shell_item(&self) -> Result<IShellItem>;
}
impl PersistIDList for IPersistIDList {
fn new() -> Result<IPersistIDList> {
unsafe { CoCreateInstance(&IPersistIDList::IID, None, CLSCTX_ALL) }
}
fn get_id_list(&self) -> Result<*mut ITEMIDLIST> {
unsafe { self.GetIDList() }
}
fn to_shell_item(&self) -> Result<IShellItem> {
let id_list = self.get_id_list()?;
let item = IShellItem::from_id_list(id_list)?;
unsafe { CoTaskMemFree(Some(id_list as _)) };
Ok(item)
}
}