Hi! I open a device under Windows:
HANDLE h = CreateFileW( ... );
in procedure:
HANDLE open_keyboard_device2( LPCWSTR path, int* error_number )
{
...
HANDLE dev_handle =
CreateFileW(
path,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL
);
...
return dev_handle;
}
and I want to close HANDLE automatically, when dev_handle destroyed by GC:
CloseHandle( h );
How to do it?
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
class SafeHandle
{
HANDLE h;
this( HANDLE h )
{
this.h = h;
}
~this()
{
if ( h != INVALID_HANDLE_VALUE )
CloseHandle( h );
}
}
and using it:
Unique!SafeHandle open_keyboard_device2( LPCWSTR path, int* error_number )
{
...
Unique!SafeHandle dev_handle =
new SafeHandle(
CreateFileW(
path,
0,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL
)
);
...
}
It complex. Because needed:
Unique!SafeHandle open_keyboard_device2( LPCWSTR path, int* error_number )
Unique!SafeHandle dev_handle = new SafeHandle( CreateFileW( ... ) );
DeviceIoControl( dev_handle.h, ...);
vs
HANDLE open_keyboard_device2( LPCWSTR path, int* error_number )
HANDLE dev_handle = CreateFileW( ... );
DeviceIoControl( dev_handle, ...);
Last is readable.
Teach me the most beautiful way.
How to make beautiful?
Thanks!