1// Copyright (c) 2010 The Chromium Authors. All rights reserved.
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 "base/basictypes.h"
11
12namespace base {
13namespace win {
14
15// Like ScopedHandle except for HGLOBAL.
16template<class T>
17class ScopedHGlobal {
18 public:
19  explicit ScopedHGlobal(HGLOBAL glob) : glob_(glob) {
20    data_ = static_cast<T*>(GlobalLock(glob_));
21  }
22  ~ScopedHGlobal() {
23    GlobalUnlock(glob_);
24  }
25
26  T* get() { return data_; }
27
28  size_t Size() const { return GlobalSize(glob_); }
29
30  T* operator->() const  {
31    assert(data_ != 0);
32    return data_;
33  }
34
35  T* release() {
36    T* data = data_;
37    data_ = NULL;
38    return data;
39  }
40
41 private:
42  HGLOBAL glob_;
43
44  T* data_;
45
46  DISALLOW_COPY_AND_ASSIGN(ScopedHGlobal);
47};
48
49}  // namespace win
50}  // namespace base
51
52#endif  // BASE_WIN_SCOPED_HGLOBAL_H_
53