1 // Copyright 2010 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef BASE_WIN_SCOPED_HGLOBAL_H_ 6 #define BASE_WIN_SCOPED_HGLOBAL_H_ 7 8 #include <windows.h> 9 10 #include <stddef.h> 11 12 namespace base { 13 namespace win { 14 15 // Like ScopedHandle except for HGLOBAL. 16 template <class T> 17 class ScopedHGlobal { 18 public: ScopedHGlobal(HGLOBAL glob)19 explicit ScopedHGlobal(HGLOBAL glob) : glob_(glob) { 20 data_ = static_cast<T>(GlobalLock(glob_)); 21 } 22 23 ScopedHGlobal(const ScopedHGlobal&) = delete; 24 ScopedHGlobal& operator=(const ScopedHGlobal&) = delete; 25 ~ScopedHGlobal()26 ~ScopedHGlobal() { GlobalUnlock(glob_); } 27 get()28 T get() { return data_; } 29 Size()30 size_t Size() const { return GlobalSize(glob_); } 31 32 T operator->() const { 33 assert(data_ != 0); 34 return data_; 35 } 36 release()37 T release() { 38 T data = data_; 39 data_ = NULL; 40 return data; 41 } 42 43 private: 44 HGLOBAL glob_; 45 46 T data_; 47 }; 48 49 } // namespace win 50 } // namespace base 51 52 #endif // BASE_WIN_SCOPED_HGLOBAL_H_ 53