#[cfg(windows)] fn main() -> windows_service::Result<()> { use std::{ thread::sleep, time::{Duration, Instant}, }; use windows_service::{ service::{ServiceAccess, ServiceState}, service_manager::{ServiceManager, ServiceManagerAccess}, }; use windows_sys::Win32::Foundation::ERROR_SERVICE_DOES_NOT_EXIST; let manager_access = ServiceManagerAccess::CONNECT; let service_manager = ServiceManager::local_computer(None::<&str>, manager_access)?; let service_access = ServiceAccess::QUERY_STATUS | ServiceAccess::STOP | ServiceAccess::DELETE; let service = service_manager.open_service("ping_service", service_access)?; // The service will be marked for deletion as long as this function call succeeds. // However, it will not be deleted from the database until it is stopped and all open handles to it are closed. service.delete()?; // Our handle to it is not closed yet. So we can still query it. if service.query_status()?.current_state != ServiceState::Stopped { // If the service cannot be stopped, it will be deleted when the system restarts. service.stop()?; } // Explicitly close our open handle to the service. This is automatically called when `service` goes out of scope. drop(service); // Win32 API does not give us a way to wait for service deletion. // To check if the service is deleted from the database, we have to poll it ourselves. let start = Instant::now(); let timeout = Duration::from_secs(5); while start.elapsed() < timeout { if let Err(windows_service::Error::Winapi(e)) = service_manager.open_service("ping_service", ServiceAccess::QUERY_STATUS) { if e.raw_os_error() == Some(ERROR_SERVICE_DOES_NOT_EXIST as i32) { println!("ping_service is deleted."); return Ok(()); } } sleep(Duration::from_secs(1)); } println!("ping_service is marked for deletion."); Ok(()) } #[cfg(not(windows))] fn main() { panic!("This program is only intended to run on Windows."); }