#![allow(non_snake_case)]
use crate::co;
use crate::decl::*;
use crate::guard::*;
use crate::kernel::privs::*;
use crate::ole::ffi;
use crate::ole::privs::*;
use crate::prelude::*;
#[must_use]
pub fn CLSIDFromProgID(prog_id: &str) -> HrResult<co::CLSID> {
let mut clsid = co::CLSID::default();
HrRet(unsafe { ffi::CLSIDFromProgID(WString::from_str(prog_id).as_ptr(), pvoid(&mut clsid)) })
.to_hrresult()
.map(|_| clsid)
}
#[must_use]
pub fn CLSIDFromProgIDEx(prog_id: &str) -> HrResult<co::CLSID> {
let mut clsid = co::CLSID::default();
HrRet(unsafe { ffi::CLSIDFromProgIDEx(WString::from_str(prog_id).as_ptr(), pvoid(&mut clsid)) })
.to_hrresult()
.map(|_| clsid)
}
#[must_use]
pub fn CLSIDFromString(prog_id: &str) -> HrResult<co::CLSID> {
let mut clsid = co::CLSID::default();
HrRet(unsafe { ffi::CLSIDFromString(WString::from_str(prog_id).as_ptr(), pvoid(&mut clsid)) })
.to_hrresult()
.map(|_| clsid)
}
#[must_use]
pub fn CoCreateGuid() -> HrResult<GUID> {
let mut guid = GUID::default();
HrRet(unsafe { ffi::CoCreateGuid(pvoid(&mut guid)) })
.to_hrresult()
.map(|_| guid)
}
#[must_use]
pub fn CoCreateInstance<T>(
clsid: &co::CLSID,
iunk_outer: Option<&impl ole_IUnknown>,
cls_context: co::CLSCTX,
) -> HrResult<T>
where
T: ole_IUnknown,
{
let mut queried = unsafe { T::null() };
HrRet(unsafe {
ffi::CoCreateInstance(
pcvoid(clsid),
iunk_outer.map_or(std::ptr::null_mut(), |uo| uo.ptr()),
cls_context.raw(),
pcvoid(&T::IID),
queried.as_mut(),
)
})
.to_hrresult()
.map(|_| queried)
}
#[must_use]
pub fn CoInitializeEx(coinit: co::COINIT) -> HrResult<CoUninitializeGuard> {
unsafe {
let hr = co::HRESULT::from_raw(ffi::CoInitializeEx(std::ptr::null_mut(), coinit.raw()));
match hr {
co::HRESULT::S_OK | co::HRESULT::S_FALSE | co::HRESULT::RPC_E_CHANGED_MODE => {
Ok(CoUninitializeGuard::new(hr))
},
hr => Err(hr),
}
}
}
pub fn CoLockObjectExternal<T>(obj: &T) -> HrResult<CoLockObjectExternalGuard<'_, T>>
where
T: ole_IUnknown,
{
unsafe {
HrRet(ffi::CoLockObjectExternal(obj.ptr(), 1, 0))
.to_hrresult()
.map(|_| CoLockObjectExternalGuard::new(obj))
}
}
#[must_use]
pub fn CoTaskMemAlloc(cb: usize) -> HrResult<CoTaskMemFreeGuard> {
let p = unsafe { ffi::CoTaskMemAlloc(cb) };
if p.is_null() {
Err(co::HRESULT::E_OUTOFMEMORY)
} else {
Ok(unsafe { CoTaskMemFreeGuard::new(p, cb) })
}
}
#[must_use]
pub fn CoTaskMemRealloc(pv: &mut CoTaskMemFreeGuard, cb: usize) -> HrResult<()> {
let (old_pmem, _) = pv.leak();
let p = unsafe { ffi::CoTaskMemRealloc(old_pmem, cb) };
if p.is_null() {
Err(co::HRESULT::E_OUTOFMEMORY)
} else {
*pv = unsafe { CoTaskMemFreeGuard::new(p, cb) };
Ok(())
}
}
#[must_use]
pub fn CreateBindCtx() -> HrResult<IBindCtx> {
let mut queried = unsafe { IBindCtx::null() };
HrRet(unsafe { ffi::CreateBindCtx(0, queried.as_mut()) })
.to_hrresult()
.map(|_| queried)
}
#[must_use]
pub fn CreateClassMoniker(clsid: &co::CLSID) -> HrResult<IMoniker> {
let mut queried = unsafe { IMoniker::null() };
HrRet(unsafe { ffi::CreateClassMoniker(pcvoid(clsid), queried.as_mut()) })
.to_hrresult()
.map(|_| queried)
}
#[must_use]
pub fn CreateFileMoniker(path_name: &str) -> HrResult<IMoniker> {
let mut queried = unsafe { IMoniker::null() };
HrRet(unsafe {
ffi::CreateFileMoniker(WString::from_str(path_name).as_ptr(), queried.as_mut())
})
.to_hrresult()
.map(|_| queried)
}
#[must_use]
pub fn CreateItemMoniker(delim: &str, item: &str) -> HrResult<IMoniker> {
let mut queried = unsafe { IMoniker::null() };
HrRet(unsafe {
ffi::CreateItemMoniker(
WString::from_str(delim).as_ptr(),
WString::from_str(item).as_ptr(),
queried.as_mut(),
)
})
.to_hrresult()
.map(|_| queried)
}
#[must_use]
pub fn CreateObjrefMoniker(unk: &impl ole_IUnknown) -> HrResult<IMoniker> {
let mut queried = unsafe { IMoniker::null() };
HrRet(unsafe { ffi::CreateObjrefMoniker(unk.ptr(), queried.as_mut()) })
.to_hrresult()
.map(|_| queried)
}
#[must_use]
pub fn CreatePointerMoniker(unk: &impl ole_IUnknown) -> HrResult<IMoniker> {
let mut queried = unsafe { IMoniker::null() };
HrRet(unsafe { ffi::CreatePointerMoniker(unk.ptr(), queried.as_mut()) })
.to_hrresult()
.map(|_| queried)
}
#[must_use]
pub fn OleInitialize() -> HrResult<OleUninitializeGuard> {
unsafe {
HrRet(ffi::OleInitialize(std::ptr::null_mut()))
.to_hrresult()
.map(|_| OleUninitializeGuard::new())
}
}
#[must_use]
pub fn StringFromCLSID(clsid: &co::CLSID) -> HrResult<String> {
let mut pstr = std::ptr::null_mut::<u16>();
HrRet(unsafe { ffi::StringFromCLSID(pcvoid(clsid), &mut pstr) })
.to_hrresult()
.map(|_| htaskmem_ptr_to_str(pstr))
}