|  | // Copyright © 2015-2017 winapi-rs developers | 
|  | // Licensed under the Apache License, Version 2.0 | 
|  | // <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | 
|  | // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option. | 
|  | // All files in the project carrying such notice may not be copied, modified, or distributed | 
|  | // except according to those terms. | 
|  |  | 
|  | #![allow(bad_style)] | 
|  |  | 
|  | use std::os::raw; | 
|  |  | 
|  | pub type wchar_t = u16; | 
|  |  | 
|  | pub type UINT = raw::c_uint; | 
|  | pub type LPUNKNOWN = *mut IUnknown; | 
|  | pub type REFIID = *const IID; | 
|  | pub type IID = GUID; | 
|  | pub type REFCLSID = *const IID; | 
|  | pub type PVOID = *mut raw::c_void; | 
|  | pub type USHORT = raw::c_ushort; | 
|  | pub type ULONG = raw::c_ulong; | 
|  | pub type LONG = raw::c_long; | 
|  | pub type DWORD = u32; | 
|  | pub type LPVOID = *mut raw::c_void; | 
|  | pub type HRESULT = raw::c_long; | 
|  | pub type LPFILETIME = *mut FILETIME; | 
|  | pub type BSTR = *mut OLECHAR; | 
|  | pub type OLECHAR = WCHAR; | 
|  | pub type WCHAR = wchar_t; | 
|  | pub type LPCOLESTR = *const OLECHAR; | 
|  | pub type LCID = DWORD; | 
|  | pub type LPCWSTR = *const WCHAR; | 
|  | pub type PULONGLONG = *mut ULONGLONG; | 
|  | pub type ULONGLONG = u64; | 
|  |  | 
|  | pub const S_OK: HRESULT = 0; | 
|  | pub const S_FALSE: HRESULT = 1; | 
|  | pub const COINIT_MULTITHREADED: u32 = 0x0; | 
|  |  | 
|  | pub type CLSCTX = u32; | 
|  |  | 
|  | pub const CLSCTX_INPROC_SERVER: CLSCTX = 0x1; | 
|  | pub const CLSCTX_INPROC_HANDLER: CLSCTX = 0x2; | 
|  | pub const CLSCTX_LOCAL_SERVER: CLSCTX = 0x4; | 
|  | pub const CLSCTX_REMOTE_SERVER: CLSCTX = 0x10; | 
|  |  | 
|  | pub const CLSCTX_ALL: CLSCTX = CLSCTX_INPROC_SERVER | | 
|  | CLSCTX_INPROC_HANDLER | CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER; | 
|  |  | 
|  | #[repr(C)] | 
|  | #[derive(Copy, Clone)] | 
|  | pub struct GUID { | 
|  | pub Data1: raw::c_ulong, | 
|  | pub Data2: raw::c_ushort, | 
|  | pub Data3: raw::c_ushort, | 
|  | pub Data4: [raw::c_uchar; 8], | 
|  | } | 
|  |  | 
|  | #[repr(C)] | 
|  | #[derive(Copy, Clone)] | 
|  | pub struct FILETIME { | 
|  | pub dwLowDateTime: DWORD, | 
|  | pub dwHighDateTime: DWORD, | 
|  | } | 
|  |  | 
|  | pub trait Interface { | 
|  | fn uuidof() -> GUID; | 
|  | } | 
|  |  | 
|  | #[link(name = "ole32")] | 
|  | #[link(name = "oleaut32")] | 
|  | extern { } | 
|  |  | 
|  | extern "system" { | 
|  | pub fn CoInitializeEx(pvReserved: LPVOID, dwCoInit: DWORD) -> HRESULT; | 
|  | pub fn CoCreateInstance(rclsid: REFCLSID, pUnkOuter: LPUNKNOWN, | 
|  | dwClsContext: DWORD, riid: REFIID, | 
|  | ppv: *mut LPVOID) -> HRESULT; | 
|  | pub fn SysFreeString(bstrString: BSTR); | 
|  | pub fn SysStringLen(pbstr: BSTR) -> UINT; | 
|  | } | 
|  |  | 
|  | #[repr(C)] | 
|  | #[derive(Copy, Clone)] | 
|  | pub struct SAFEARRAYBOUND { | 
|  | pub cElements: ULONG, | 
|  | pub lLbound: LONG, | 
|  | } | 
|  |  | 
|  | #[repr(C)] | 
|  | #[derive(Copy, Clone)] | 
|  | pub struct SAFEARRAY { | 
|  | pub cDims: USHORT, | 
|  | pub fFeatures: USHORT, | 
|  | pub cbElements: ULONG, | 
|  | pub cLocks: ULONG, | 
|  | pub pvData: PVOID, | 
|  | pub rgsabound: [SAFEARRAYBOUND; 1], | 
|  | } | 
|  |  | 
|  | pub type LPSAFEARRAY = *mut SAFEARRAY; | 
|  |  | 
|  | macro_rules! DEFINE_GUID { | 
|  | ( | 
|  | $name:ident, $l:expr, $w1:expr, $w2:expr, | 
|  | $b1:expr, $b2:expr, $b3:expr, $b4:expr, $b5:expr, $b6:expr, $b7:expr, $b8:expr | 
|  | ) => { | 
|  | pub const $name: $crate::winapi::GUID = $crate::winapi::GUID { | 
|  | Data1: $l, | 
|  | Data2: $w1, | 
|  | Data3: $w2, | 
|  | Data4: [$b1, $b2, $b3, $b4, $b5, $b6, $b7, $b8], | 
|  | }; | 
|  | } | 
|  | } | 
|  |  | 
|  | macro_rules! RIDL { | 
|  | (#[uuid($($uuid:expr),+)] | 
|  | interface $interface:ident ($vtbl:ident) {$( | 
|  | fn $method:ident($($p:ident : $t:ty,)*) -> $rtr:ty, | 
|  | )+}) => ( | 
|  | #[repr(C)] | 
|  | pub struct $vtbl { | 
|  | $(pub $method: unsafe extern "system" fn( | 
|  | This: *mut $interface, | 
|  | $($p: $t),* | 
|  | ) -> $rtr,)+ | 
|  | } | 
|  | #[repr(C)] | 
|  | pub struct $interface { | 
|  | pub lpVtbl: *const $vtbl, | 
|  | } | 
|  | RIDL!{@impl $interface {$(fn $method($($p: $t,)*) -> $rtr,)+}} | 
|  | RIDL!{@uuid $interface $($uuid),+} | 
|  | ); | 
|  | (#[uuid($($uuid:expr),+)] | 
|  | interface $interface:ident ($vtbl:ident) : $pinterface:ident ($pvtbl:ident) { | 
|  | }) => ( | 
|  | #[repr(C)] | 
|  | pub struct $vtbl { | 
|  | pub parent: $pvtbl, | 
|  | } | 
|  | #[repr(C)] | 
|  | pub struct $interface { | 
|  | pub lpVtbl: *const $vtbl, | 
|  | } | 
|  | RIDL!{@deref $interface $pinterface} | 
|  | RIDL!{@uuid $interface $($uuid),+} | 
|  | ); | 
|  | (#[uuid($($uuid:expr),+)] | 
|  | interface $interface:ident ($vtbl:ident) : $pinterface:ident ($pvtbl:ident) {$( | 
|  | fn $method:ident($($p:ident : $t:ty,)*) -> $rtr:ty, | 
|  | )+}) => ( | 
|  | #[repr(C)] | 
|  | pub struct $vtbl { | 
|  | pub parent: $pvtbl, | 
|  | $(pub $method: unsafe extern "system" fn( | 
|  | This: *mut $interface, | 
|  | $($p: $t,)* | 
|  | ) -> $rtr,)+ | 
|  | } | 
|  | #[repr(C)] | 
|  | pub struct $interface { | 
|  | pub lpVtbl: *const $vtbl, | 
|  | } | 
|  | RIDL!{@impl $interface {$(fn $method($($p: $t,)*) -> $rtr,)+}} | 
|  | RIDL!{@deref $interface $pinterface} | 
|  | RIDL!{@uuid $interface $($uuid),+} | 
|  | ); | 
|  | (@deref $interface:ident $pinterface:ident) => ( | 
|  | impl ::std::ops::Deref for $interface { | 
|  | type Target = $pinterface; | 
|  | #[inline] | 
|  | fn deref(&self) -> &$pinterface { | 
|  | unsafe { &*(self as *const $interface as *const $pinterface) } | 
|  | } | 
|  | } | 
|  | ); | 
|  | (@impl $interface:ident {$( | 
|  | fn $method:ident($($p:ident : $t:ty,)*) -> $rtr:ty, | 
|  | )+}) => ( | 
|  | impl $interface { | 
|  | $(#[inline] pub unsafe fn $method(&self, $($p: $t,)*) -> $rtr { | 
|  | ((*self.lpVtbl).$method)(self as *const _ as *mut _, $($p,)*) | 
|  | })+ | 
|  | } | 
|  | ); | 
|  | (@uuid $interface:ident | 
|  | $l:expr, $w1:expr, $w2:expr, | 
|  | $b1:expr, $b2:expr, $b3:expr, $b4:expr, $b5:expr, $b6:expr, $b7:expr, $b8:expr | 
|  | ) => ( | 
|  | impl $crate::winapi::Interface for $interface { | 
|  | #[inline] | 
|  | fn uuidof() -> $crate::winapi::GUID { | 
|  | $crate::winapi::GUID { | 
|  | Data1: $l, | 
|  | Data2: $w1, | 
|  | Data3: $w2, | 
|  | Data4: [$b1, $b2, $b3, $b4, $b5, $b6, $b7, $b8], | 
|  | } | 
|  | } | 
|  | } | 
|  | ); | 
|  | } | 
|  |  | 
|  | RIDL!{#[uuid(0x00000000, 0x0000, 0x0000, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46)] | 
|  | interface IUnknown(IUnknownVtbl) { | 
|  | fn QueryInterface( | 
|  | riid: REFIID, | 
|  | ppvObject: *mut *mut raw::c_void, | 
|  | ) -> HRESULT, | 
|  | fn AddRef() -> ULONG, | 
|  | fn Release() -> ULONG, | 
|  | }} |