1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#[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)?;
service.delete()?;
if service.query_status()?.current_state != ServiceState::Stopped {
service.stop()?;
}
drop(service);
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.");
}