use windows::Win32::{
Foundation::RPC_E_CHANGED_MODE,
System::Com::{COINIT_MULTITHREADED, CoInitializeEx, CoUninitialize},
};
pub(crate) struct ComApartment {
uninitialize: bool,
}
impl ComApartment {
pub(crate) fn new() -> windows::core::Result<Self> {
let result = unsafe { CoInitializeEx(None, COINIT_MULTITHREADED) };
if result == RPC_E_CHANGED_MODE {
return Ok(Self {
uninitialize: false,
});
}
result.ok()?;
Ok(Self { uninitialize: true })
}
}
impl Drop for ComApartment {
fn drop(&mut self) {
if self.uninitialize {
unsafe { CoUninitialize() };
}
}
}