Hacer que HANDLE RAII sea compatible con shared_ptr con un eliminador personalizado
Recientemente publiqué una pregunta general sobre RAII enASI QUE. Sin embargo, todavía tengo algunos problemas de implementación con mi ejemplo HANDLE.
A HANDLE
está tipificado avoid *
enwindows.h
. Por lo tanto, la correctashared_ptr
definición tiene que ser
std::tr1::shared_ptr<void> myHandle (INVALID_HANDLE_VALUE, CloseHandle);
Ejemplo 1 CreateToolhelp32Snapshot
: devolucionesHANDLE
y trabaja.
const std::tr1::shared_ptr<void> h
(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL), CloseHandle);
Como yo usovoid
en la definición (¿cuál es la manera correcta?) los problemas continúan cuando intento llamar a algunos comandos winapi más con este puntero. Funcionan funcionalmente, pero son feas y estoy seguro de que tiene que haber una mejor solución.
En los siguientes ejemplos,h
es un puntero que fue creado a través de la definición en la parte superior.
Ejemplo 2 OpenProcessToken
: último argumento es unPHANDLE
. Medio feo con el elenco.
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
(PHANDLE)&h);
Ejemplo 3 Process32First
: primer argumento es unHANDLE
. Realmente feo.
Process32First(*((PHANDLE)&h), &pEntry);
Ejemplo 4 comparación simple con una constanteHANDLE
. Realmente feo.
if (*((PHANDLE)&h) == INVALID_HANDLE) { /* do something */ }
¿Cuál es la forma correcta de crear un shared_ptr adecuado para un HANDLE?