Ho recentemente pubblicato una domanda generica su RAII allo SO. Tuttavia, ho ancora alcuni problemi di implementazione con il mio esempio HANDLE.Creazione di un comando HANDLE RAII utilizzando shared_ptr con un deleter personalizzato
A HANDLE
è impostato su void *
in windows.h
. Pertanto, la corretta shared_ptr
definizione deve essere
std::tr1::shared_ptr<void> myHandle (INVALID_HANDLE_VALUE, CloseHandle);
Esempio 1CreateToolhelp32Snapshot
: torna HANDLE
e lavora.
const std::tr1::shared_ptr<void> h
(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL), CloseHandle);
come io uso void
nella definizione (qual è il modo corretto?) Problemi andare avanti, quando provo a chiamare un po 'winapi comandi con questo puntatore. Funzionano funzionalmente, ma sono brutti e sono sicuro che ci deve essere una soluzione migliore.
Negli esempi seguenti, h
è un puntatore creato tramite la definizione nella parte superiore.
Esempio 2OpenProcessToken
: l'ultimo argomento è un PHANDLE
. medio brutto con il cast.
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
(PHANDLE)&h);
Esempio 3Process32First
: primo argomento è un HANDLE
. DAVVERO brutto.
Process32First(*((PHANDLE)&h), &pEntry);
Esempio 4 semplice confronto con una costante HANDLE
. DAVVERO brutto.
if (*((PHANDLE)&h) == INVALID_HANDLE) { /* do something */ }
Qual è il modo corretto di creare un shared_ptr corretto per una MANIGLIA?
C'è qualche possibilità di cancellare il 'HANDLE' non sicuro dopo averlo convertito in uno sicuro nel primo frammento di codice di esempio 2? – Etan
È possibile creare una funzione che avvolge OpenProcessHandle() (l'ho aggiunto al post) o eseguire la stessa operazione rispetto al secondo snippet, con shared_h inizializzato su INVALID_HANDLE_VALUE –