30 lines
670 B
Rust
30 lines
670 B
Rust
use std::os::windows::io::RawHandle;
|
|
use windows_sys::Win32::Foundation::{CloseHandle, HANDLE};
|
|
|
|
/// Wrapper around a Windows HANDLE so that we close it upon drop in all scenarios
|
|
#[derive(Debug)]
|
|
pub struct Handle(HANDLE);
|
|
|
|
impl Handle {
|
|
#[inline]
|
|
pub fn new(handle: HANDLE) -> Self {
|
|
Self(handle)
|
|
}
|
|
|
|
pub fn raw(&self) -> HANDLE {
|
|
self.0
|
|
}
|
|
|
|
pub fn into_raw(self) -> RawHandle {
|
|
let ret = self.0;
|
|
// This is super important so that drop is not called!
|
|
std::mem::forget(self);
|
|
ret as RawHandle
|
|
}
|
|
}
|
|
|
|
impl Drop for Handle {
|
|
fn drop(&mut self) {
|
|
unsafe { CloseHandle(self.0) };
|
|
}
|
|
}
|