use windows::core::{implement, ComObject};
use windows::Win32::Foundation::E_POINTER;
use windows::Win32::System::Com::{IClassFactory, IClassFactory_Impl};
use windows_core::Interface;
use crate::bindings::IExtension;
use crate::ext::Extension;
#[implement(IClassFactory)]
pub struct ExtensionClassFactory(pub ComObject<Extension>);
impl IClassFactory_Impl for ExtensionClassFactory_Impl {
#[allow(clippy::not_unsafe_ptr_arg_deref)]
fn CreateInstance(&self, _: windows_core::Ref<'_, windows_core::IUnknown>, iid: *const windows_core::GUID, interface: *mut *mut core::ffi::c_void) -> windows_core::Result<()> {
if iid.is_null() || interface.is_null() {
return Err(E_POINTER.into());
}
let extension = self.0.cast::<IExtension>()?;
unsafe {
extension.query(iid, interface).ok()
}
}
fn LockServer(&self, _: windows_core::BOOL) -> windows_core::Result<()> {
Ok(())
}
}