Создание 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?