unique_ptr | Unique for autoclose handle
Vitaliy Fadeev
vital.fadeev at gmail.com
Wed Dec 14 13:58:20 UTC 2022
On Wednesday, 14 December 2022 at 11:30:07 UTC, Vitaliy Fadeev
wrote:
> How to define HANDLE var ? What to return from procedure? How
> to call CloseHandle( h ) when variable destroyed?
>
> I was trying **std.typecons.Unique**. But where I must put
> **CloseHandle( h )** ?
> I was trying **std.typecons.Unique** with custom class
> **SafeHabdle**
Last try is:
```
struct SafeHandle
{
Unique!void _safe;
alias _safe this;
this( HANDLE h )
{
this._safe = h;
}
~this()
{
if ( cast(HANDLE)_safe !is null )
if ( cast(HANDLE)_safe != INVALID_HANDLE_VALUE )
{
if ( CloseHandle( cast(HANDLE)_safe ) == 0 )
cast(HANDLE)_safe = null;
}
}
ref HANDLE get()
{
return cast( HANDLE )_safe;
}
}
```
and using:
```
SafeHandle open_keyboard_device2( LPCWSTR path, int* error_number
)
{
...
SafeHandle dev_handle =
CreateFileW(
path,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL
);
if ( dev_handle.get() != INVALID_HANDLE_VALUE )
...
...
}
void processDevice( ... )
{
auto dev_handle = open_keyboard_device2( path, &err );
set_keyboard_indicator2( dev_handle, KEYBOARD_CAPS_LOCK_ON );
...
}
```
May be good, but testing...
More information about the Digitalmars-d-learn
mailing list