use super::inspectable::IInspectable;
use windows::core::{IInspectable as CoreIInspectable, Interface, HSTRING};
use windows::Win32::System::WinRT::RoGetActivationFactory;
#[repr(transparent)]
pub struct IActivationFactory {
inner: CoreIInspectable,
}
impl IActivationFactory {
pub fn get(class_name: &str) -> windows::core::Result<Self> {
unsafe {
let name = HSTRING::from(class_name);
let factory: CoreIInspectable = RoGetActivationFactory(&name)?;
Ok(IActivationFactory { inner: factory })
}
}
pub fn activate_instance<T: Interface>(&self) -> windows::core::Result<T> {
self.inner.cast()
}
pub fn cast<T: Interface>(&self) -> windows::core::Result<T> {
self.inner.cast()
}
pub fn as_inspectable(&self) -> IInspectable {
IInspectable::from(self.inner.clone())
}
}
impl Clone for IActivationFactory {
fn clone(&self) -> Self {
IActivationFactory {
inner: self.inner.clone(),
}
}
}
impl From<CoreIInspectable> for IActivationFactory {
fn from(inner: CoreIInspectable) -> Self {
IActivationFactory { inner }
}
}
unsafe impl Send for IActivationFactory {}
unsafe impl Sync for IActivationFactory {}
pub fn activate<T: Interface>(class_name: &str) -> windows::core::Result<T> {
let factory = IActivationFactory::get(class_name)?;
factory.activate_instance()
}