baseview 0.2.2

Low-level windowing system geared towards making audio plugin UIs.
Documentation
use std::ffi::c_void;
use std::ptr::NonNull;
use windows_core::{Error, PCSTR};
use windows_sys::Win32::Foundation::FreeLibrary;
use windows_sys::Win32::System::LibraryLoader::{GetProcAddress, LoadLibraryA};

pub struct LibraryModule(NonNull<c_void>);

impl LibraryModule {
    pub unsafe fn load(module_name: PCSTR) -> Result<Self, Error> {
        let library = unsafe { LoadLibraryA(module_name.as_ptr()) };
        let Some(library) = NonNull::new(library) else { return Err(Error::from_thread()) };

        Ok(Self(library))
    }

    pub unsafe fn get_proc_address(&self, name: PCSTR) -> Option<*const c_void> {
        let addr = unsafe { GetProcAddress(self.0.as_ptr(), name.as_ptr()) };

        addr.map(|f| f as _)
    }
}

impl Drop for LibraryModule {
    fn drop(&mut self) {
        unsafe { FreeLibrary(self.0.as_ptr()) };
    }
}