From bc3c1a8ed6b1c2e6de1e32cf11d0fa342c7b463e Mon Sep 17 00:00:00 2001 From: Ged Murphy Date: Mon, 30 Nov 2015 12:07:18 +0000 Subject: [PATCH] [ATL] - Implement CHandle svn path=/trunk/; revision=70217 --- reactos/lib/atl/atlbase.h | 74 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/reactos/lib/atl/atlbase.h b/reactos/lib/atl/atlbase.h index 675b96d8cb7..43fe6ca480a 100644 --- a/reactos/lib/atl/atlbase.h +++ b/reactos/lib/atl/atlbase.h @@ -232,6 +232,80 @@ public: } }; + +class CHandle +{ +public: + HANDLE m_handle; + +public: + CHandle() : + m_handle(NULL) + { + } + + CHandle(_Inout_ CHandle& handle) : + m_handle(NULL) + { + Attach(handle.Detach()); + } + + explicit CHandle(_In_ HANDLE handle) : + m_handle(handle) + { + } + + ~CHandle() + { + if (m_handle) + { + Close(); + } + } + + CHandle& operator=(_Inout_ CHandle& handle) + { + if (this != &handle) + { + if (m_handle) + { + Close(); + } + Attach(handle.Detach()); + } + + return *this; + } + + operator HANDLE() const + { + return m_handle; + } + + void Attach(_In_ HANDLE handle) + { + ATLASSERT(m_handle == NULL); + m_handle = handle; + } + + HANDLE Detach() + { + HANDLE handle = m_handle; + m_handle = NULL; + return handle; + } + + void Close() + { + if (m_handle) + { + ::CloseHandle(m_handle); + m_handle = NULL; + } + } +}; + + inline BOOL WINAPI InlineIsEqualUnknown(REFGUID rguid1) { return (