// Prevents additional console window on Windows in release #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] fn main() { #[cfg(windows)] if !webview2_check::is_webview2_installed() { webview2_check::show_missing_dialog(); return; } core_cooldown_lib::run() } #[cfg(windows)] mod webview2_check { use std::ptr; use winapi::um::winuser::{MessageBoxW, MB_OK, MB_ICONWARNING}; use winapi::um::shellapi::ShellExecuteW; // Statically linked from WebView2LoaderStatic.lib via msvc_compat shims extern "system" { fn GetAvailableCoreWebView2BrowserVersionString( browser_executable_folder: *const u16, version_info: *mut *mut u16, ) -> i32; } extern "system" { fn CoTaskMemFree(pv: *mut std::ffi::c_void); } fn to_wide(s: &str) -> Vec { s.encode_utf16().chain(std::iter::once(0)).collect() } pub fn is_webview2_installed() -> bool { unsafe { let mut version_info: *mut u16 = ptr::null_mut(); let hr = GetAvailableCoreWebView2BrowserVersionString( ptr::null(), &mut version_info, ); let installed = hr == 0 && !version_info.is_null(); if !version_info.is_null() { CoTaskMemFree(version_info as *mut _); } installed } } pub fn show_missing_dialog() { let title = to_wide("Core Cooldown - WebView2 Required"); let message = to_wide( "Microsoft WebView2 Runtime is required to run Core Cooldown, \ but it was not found on this system.\n\n\ Click OK to open the download page in your browser.\n\n\ After installing WebView2, restart Core Cooldown." ); let url = to_wide("https://developer.microsoft.com/en-us/microsoft-edge/webview2/consumer"); let open = to_wide("open"); unsafe { MessageBoxW(ptr::null_mut(), message.as_ptr(), title.as_ptr(), MB_OK | MB_ICONWARNING); ShellExecuteW(ptr::null_mut(), open.as_ptr(), url.as_ptr(), ptr::null(), ptr::null(), 1); } } }