From: Vadim Zeitlin Date: Sun, 23 Mar 2003 20:36:51 +0000 (+0000) Subject: added GlobalHandle X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/51a2a728e5ed2262db8504ab35c6b9c422e8626a added GlobalHandle git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@19741 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/msw/private.h b/include/wx/msw/private.h index 9d639f1fb8..3bd6f49620 100644 --- a/include/wx/msw/private.h +++ b/include/wx/msw/private.h @@ -395,7 +395,46 @@ private: HDC m_hdc; HGDIOBJ m_hgdiobj; - DECLARE_NO_COPY_CLASS(SelectInHDC) + DECLARE_NO_COPY_CLASS(SelectInHDC) +}; + +// when working with global pointers (which is unfortunately still necessary +// sometimes, e.g. for clipboard) it is important to unlock them exactly as +// many times as we lock them which just asks for using a "smart lock" class +class GlobalHandle +{ +public: + GlobalHandle(HGLOBAL hGlobal) : m_hGlobal(hGlobal) + { + m_ptr = ::GlobalLock(hGlobal); + if ( !m_ptr ) + { + wxLogLastError(_T("GlobalLock")); + } + } + + ~GlobalHandle() + { + if ( !::GlobalUnlock(m_hGlobal) ) + { +#ifdef __WXDEBUG__ + // this might happen simply because the block became unlocked + DWORD dwLastError = ::GetLastError(); + if ( dwLastError != NO_ERROR ) + { + wxLogApiError(_T("GlobalUnlock"), dwLastError); + } +#endif // __WXDEBUG__ + } + } + + operator void *() const { return m_ptr; } + +private: + HGLOBAL m_hGlobal; + void *m_ptr; + + DECLARE_NO_COPY_CLASS(GlobalHandle) }; // ---------------------------------------------------------------------------