我最近在Stack Overflow上发布了一个关于RAII的一般性问题:SO。然而,我在处理HANDLE示例时仍然存在一些实现问题。
在windows.h中,
在windows.h中,
HANDLE
被typedef为void *
。因此,正确的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
: 最后一个参数是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 */ }
如何正确创建一个适用于 HANDLE 的 shared_ptr?
type_traits
中的std::remove_pointer <HANDLE> ::type
来稍微减少使用void
类型的“丑陋”。 - Andrey Starodubtsev