我最近在SO发布了一个关于 RAII 的一般性问题。但是,我的 HANDLE 示例仍然存在一些实现问题。
AHANDLE
被输入到void *
in windows.h
。因此,正确的shared_ptr
定义必须是
std::tr1::shared_ptr<void> myHandle (INVALID_HANDLE_VALUE, CloseHandle);
示例 1 CreateToolhelp32Snapshot
:返回HANDLE
和工作。
const std::tr1::shared_ptr<void> h
(CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL), CloseHandle);
正如我void
在定义中使用的那样(正确的方法是什么?),当我尝试用这个指针调用更多的 winapi 命令时,问题还在继续。它们在功能上有效,但很丑陋,我相信必须有更好的解决方案。
在以下示例中,h
是通过顶部定义创建的指针。
示例 2 OpenProcessToken
:最后一个参数是 a PHANDLE
。演员阵容中等丑陋。
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
(PHANDLE)&h);
示例 3 Process32First
:第一个参数是 a HANDLE
。真的很丑。
Process32First(*((PHANDLE)&h), &pEntry);
示例 4与常数的简单比较HANDLE
。真的很丑。
if (*((PHANDLE)&h) == INVALID_HANDLE) { /* do something */ }
为 HANDLE 创建正确的 shared_ptr 的正确方法是什么?