#![allow(non_snake_case, clippy::missing_safety_doc)]
use crate::helper_bindings::*;
use windows_core::*;
type DllGetClassObject =
unsafe extern "system" fn(*const GUID, *const GUID, *mut *mut std::ffi::c_void) -> HRESULT;
pub unsafe fn NoRegCoCreate<T: Interface>(lib: PCSTR, rclsid: *const GUID) -> Result<T> {
let instance = LoadLibraryExA(lib, None, LOAD_WITH_ALTERED_SEARCH_PATH)?;
if !instance.is_invalid() {
if let Some(farproc) = GetProcAddress(instance, s!("DllGetClassObject")) {
let get_class_object: DllGetClassObject = std::mem::transmute(farproc);
let mut factory: Option<IClassFactory> = None;
if get_class_object(
rclsid,
&IClassFactory::IID,
&mut factory as *mut _ as *mut _,
)
.is_ok()
{
return factory.unwrap().CreateInstance(None);
}
}
}
Err(Error::from_thread())
}