use std::ffi::OsString;
use std::os::windows::ffi::OsStringExt;
use std::path::PathBuf;
use windows_sys::Win32::Foundation::{GetLastError, ERROR_INSUFFICIENT_BUFFER, MAX_PATH};
use windows_sys::Win32::System::LibraryLoader::GetModuleFileNameW;
pub fn get_exe_path() -> Option<PathBuf> {
unsafe {
let mut buf: [u16; MAX_PATH as usize] = [0; MAX_PATH as usize];
let res = GetModuleFileNameW(std::ptr::null_mut(), &mut buf as _, MAX_PATH);
if res == 0 {
return None; } else if res == MAX_PATH {
let err = GetLastError();
if err == ERROR_INSUFFICIENT_BUFFER {
let mut len = MAX_PATH as usize * 2;
loop {
let mut v = Vec::with_capacity(len);
let res = GetModuleFileNameW(std::ptr::null_mut(), v.as_mut_ptr(), len as u32);
if res == 0 {
return None; } else if res == len as u32 {
let err = GetLastError();
if err != ERROR_INSUFFICIENT_BUFFER {
break;
}
} else {
break;
}
len *= 2;
}
}
}
let str1 = OsString::from_wide(&buf[..res as usize]);
Some(PathBuf::from(str1).parent()?.into())
}
}
pub fn get_resources_dir() -> Option<PathBuf> {
None
}