use crate::{
core::optional::NSTDOptional, os::windows::NSTDWindowsHandle, NSTDAny, NSTDAnyMut, NSTDChar,
NSTDChar16,
};
use nstdapi::nstdapi;
use windows_sys::Win32::System::LibraryLoader::{FreeLibrary, GetProcAddress, LoadLibraryW};
#[nstdapi]
pub struct NSTDWindowsSharedLib {
handle: NSTDWindowsHandle,
}
impl Drop for NSTDWindowsSharedLib {
#[inline]
fn drop(&mut self) {
unsafe { FreeLibrary(self.handle) };
}
}
unsafe impl Send for NSTDWindowsSharedLib {}
unsafe impl Sync for NSTDWindowsSharedLib {}
pub type NSTDWindowsOptionalSharedLib = NSTDOptional<NSTDWindowsSharedLib>;
#[inline]
#[nstdapi]
pub unsafe fn nstd_os_windows_shared_lib_load(
name: *const NSTDChar16,
) -> NSTDWindowsOptionalSharedLib {
match LoadLibraryW(name) {
0 => NSTDOptional::None,
handle => NSTDOptional::Some(NSTDWindowsSharedLib { handle }),
}
}
#[inline]
#[nstdapi]
pub const fn nstd_os_windows_shared_lib_handle(lib: &NSTDWindowsSharedLib) -> NSTDWindowsHandle {
lib.handle
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_os_windows_shared_lib_get(
lib: &NSTDWindowsSharedLib,
symbol: *const NSTDChar,
) -> NSTDAny {
core::mem::transmute(GetProcAddress(lib.handle, symbol.cast()))
}
#[inline]
#[nstdapi]
pub unsafe fn nstd_os_windows_shared_lib_get_mut(
lib: &mut NSTDWindowsSharedLib,
symbol: *const NSTDChar,
) -> NSTDAnyMut {
core::mem::transmute(GetProcAddress(lib.handle, symbol.cast()))
}
#[inline]
#[nstdapi]
#[allow(
unused_variables,
clippy::missing_const_for_fn,
clippy::needless_pass_by_value
)]
pub unsafe fn nstd_os_windows_shared_lib_free(lib: NSTDWindowsSharedLib) {}