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?

Respuestas a la pregunta(4)

Su respuesta a la pregunta