use winapi::{HRESULT, LPVOID, REFIID, ULONG};
use super::{AsPtr, IID};
#[allow(raw_pointer_derive)]
#[derive(Debug)]
#[repr(C)]
pub struct IUnknown {
vtable: *const IUnknownVtbl
}
#[repr(C)]
#[doc(hidden)]
pub struct IUnknownVtbl {
pub query_interface: extern "stdcall" fn(
*const IUnknown, REFIID, *mut LPVOID) -> HRESULT,
pub add_ref: extern "stdcall" fn(*const IUnknown) -> ULONG,
pub release: extern "stdcall" fn(*const IUnknown) -> ULONG
}
const IID_IUNKNOWN: IID = IID {
Data1: 0x00000000,
Data2: 0x0000,
Data3: 0x0000,
Data4: [0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46]
};
pub trait Unknown {
unsafe fn query_interface(&self, iid: REFIID, object: *mut LPVOID)
-> HRESULT {
let obj: &&IUnknown = ::std::mem::transmute(&self);
((*obj.vtable).query_interface)(*obj, iid, object)
}
unsafe fn add_ref(&self) -> ULONG {
let obj: &&IUnknown = ::std::mem::transmute(&self);
((*obj.vtable).add_ref)(*obj)
}
unsafe fn release(&self) -> ULONG {
let obj: &&IUnknown = ::std::mem::transmute(&self);
((*obj.vtable).release)(*obj)
}
}
impl Unknown for IUnknown { }
unsafe impl AsPtr<IUnknown> for IUnknown { }
unsafe impl ::ComInterface for IUnknown {
#[doc(hidden)]
type Vtable = IUnknownVtbl;
fn iid() -> ::IID { IID_IUNKNOWN }
}