#![allow(non_camel_case_types, non_snake_case)]
use crate::co;
use crate::decl::*;
use crate::kernel::privs::*;
use crate::ole::{privs::*, vts::*};
com_interface! { IUnknown: "00000000-0000-0000-c000-000000000046";
}
pub trait ole_IUnknown: Clone {
const IID: co::IID;
#[must_use]
unsafe fn from_ptr(p: *mut std::ffi::c_void) -> Self;
#[must_use]
fn ptr(&self) -> *mut std::ffi::c_void;
#[must_use]
unsafe fn as_mut(&mut self) -> &mut *mut std::ffi::c_void;
#[must_use]
unsafe fn null() -> Self {
unsafe { Self::from_ptr(std::ptr::null_mut()) }
}
#[must_use]
fn leak(&mut self) -> *mut std::ffi::c_void {
let p = self.ptr();
unsafe {
*self.as_mut() = std::ptr::null_mut();
}
p
}
#[must_use]
fn QueryInterface<T>(&self) -> HrResult<T>
where
T: ole_IUnknown,
{
let mut queried = unsafe { T::null() };
HrRet(unsafe {
(vt::<IUnknownVT>(self).QueryInterface)(self.ptr(), pcvoid(&T::IID), queried.as_mut())
})
.to_hrresult()
.map(|_| queried)
}
}