Создание HANDLE RAII-совместимого с использованием shared_ptr с пользовательским средством удаления

Мы недавно опубликовали общий вопрос о RAII наТАК, Тем не менее, у меня все еще есть некоторые проблемы с реализацией моего примера HANDLE.

HANDLE вводится вvoid * вwindows.h, Следовательно, правильныйshared_ptr определение должно быть

std::tr1::shared_ptr myHandle (INVALID_HANDLE_VALUE, CloseHandle);

Пример 1 CreateToolhelp32Snapshot: возвращаетсяHANDLE и работает.

const std::tr1::shared_ptr h
    (CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL), CloseHandle);

Как я используюvoid В определении (каков правильный путь?) возникают проблемы, когда я пытаюсь вызвать еще несколько команд winapi с этим указателем. Они функционально работают, но безобразны, и я уверен, что должно быть лучшее решение.

В следующих примерахh это указатель, который был создан с помощью определения в верхней части.

Пример 2 OpenProcessToken: последний аргументPHANDLE, средний уродливый с актерами.

OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
    (PHANDLE)&h);

Пример 3 Process32First: первый аргументHANDLE, Действительно уродливый

Process32First(*((PHANDLE)&h), &pEntry);

Пример 4 простое сравнение с константойHANDLE, Действительно уродливый

if (*((PHANDLE)&h) == INVALID_HANDLE) { /* do something */ }

Как правильно создать правильный shared_ptr для HANDLE?

Ответы на вопрос(4)

Ваш ответ на вопрос