Solution46
CMapping.cpp
[詳解]
1 //=============================================================================
2 /// @file
3 /// マッピングクラス実装ファイル
4 ///
5 /// マッピングクラス実装ファイルです。
6 ///
7 /// $Id: CMapping.cpp 245 2019-03-20 15:03:41Z admin $
8 /// $Date: 2019-03-21 00:03:41 +0900 (2019/03/21 (木)) $
9 /// $Author: admin $
10 ///
11 /// @attention なし
12 
13 #pragma managed( push, off )
14 
15 //=============================================================================
16 // インクルードファイル
17 #include <CMapping.h>
18 #include <CSyncAuto.h>
19 
20 //=============================================================================
21 // 共通ライブラリ名前空間
22 namespace LibCommon {
23  //=========================================================================
24  // マッピングクラス
25  //=========================================================================
26  // 構築子と解体子
27  //-------------------------------------------------------------------------
28  // コンストラクタ
29  CMapping::CMapping() noexcept
30  // 基底クラスコンストラクタ
31  : CMutex()
32  // メンバ変数初期化
33  , m_hMapping( nullptr )
34  , m_pView( nullptr )
35  {}
36 
37  //-------------------------------------------------------------------------
38  // デストラクタ
39  CMapping::~CMapping() noexcept {
40  // クローズする
41  Close();
42  }
43 
44  //=========================================================================
45  // 公開関数
46  //-------------------------------------------------------------------------
47  // クローズ関数
48  void CMapping::Close() noexcept {
49  // ビューマップを解放する
50  ::UnmapViewOfFile( m_pView );
51 
52  // マッピングをクローズする
53  ::CloseHandle( m_hMapping );
54 
55  // メンバ変数を初期化する
56  m_hMapping = nullptr;
57  m_pView = nullptr;
58 
59  // 基底クラスの関数を実行する
60  CMutex::Close();
61  }
62 
63  //-------------------------------------------------------------------------
64  // 作成関数
65  bool CMapping::Create( DWORD dwSize, wchar_t const* pszObjectName ) noexcept {
66  // 処理ブロック
67  bool result = false;
68  do {
69  // マッピングハンドルを調べる
70  if ( nullptr != m_hMapping ) {
71  // クローズする
72  Close();
73  }
74  // ミューテックスを作成する
75  else if ( !CMutex::Create( pszObjectName ) ) {
76  // 失敗!
77  break;
78  }
79  // 同期処理ブロック
80  else do {
81  CSyncAuto cSyncAuto( *this );
82 
83  // オブジェクト名を調べる
84  wchar_t szBuffer[ MAX_PATH ];
85  if ( nullptr != pszObjectName ) {
86  // オブジェクト名に拡張子を追加する
87  ::wcscpy_s( szBuffer, pszObjectName );
88  ::wcscat_s( szBuffer, OBJECT_NAME_EXT );
89  pszObjectName = szBuffer;
90  }
91 
92  // マッピングを作成する
93  m_hMapping = ::CreateFileMappingW( nullptr, nullptr, PAGE_READWRITE, 0, dwSize, pszObjectName );
94  if ( nullptr == m_hMapping ) {
95  // 失敗!
96  break;
97  }
98 
99  // ビューメモリをマップする
100  m_pView = ::MapViewOfFile( m_hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0 );
101  if ( nullptr == m_pView ) {
102  // マッピングをクローズする
103  ::CloseHandle( m_hMapping );
104  m_hMapping = nullptr;
105 
106  // 失敗!
107  break;
108  }
109  // 新規作成フラグを調べる
110  else if ( m_bIsCreate ) {
111  // メモリをクリアする
112  ::memset( m_pView, 0, dwSize );
113  }
114 
115  // 成功!
116  result = true;
117  } while ( false );
118 
119  // 実行結果を調べる
120  if ( !result ) {
121  // ミューテックスをクローズする
122  CMutex::Close();
123  }
124  } while ( false );
125 
126  // 実行結果を返す
127  return result;
128  }
129 
130  //-------------------------------------------------------------------------
131  // オープン関数
132  bool CMapping::Open( wchar_t const* pszObjectName ) noexcept {
133  // 処理ブロック
134  bool result = false;
135  do {
136  // オブジェクト名を調べる
137  if ( nullptr == pszObjectName ) {
138  // 失敗!
139  break;
140  }
141  // マッピングハンドルを調べる
142  else if ( nullptr != m_hMapping ) {
143  // クローズする
144  Close();
145  }
146  // ミューテックスをオープンする
147  else if ( !CMutex::Open( pszObjectName ) ) {
148  // 失敗!
149  break;
150  }
151  // 同期処理ブロック
152  else do {
153  CSyncAuto cSyncAuto( *this );
154 
155  // オブジェクト名に拡張子を追加する
156  wchar_t szBuffer[ MAX_PATH ];
157  ::wcscpy_s( szBuffer, pszObjectName );
158  ::wcscat_s( szBuffer, OBJECT_NAME_EXT );
159  pszObjectName = szBuffer;
160 
161  // マッピングをオープンする
162  m_hMapping = ::OpenFileMappingW( FILE_MAP_ALL_ACCESS, false, pszObjectName );
163  if ( nullptr == m_hMapping ) {
164  // 失敗!
165  break;
166  }
167 
168  // ビューメモリをマップする
169  m_pView = ::MapViewOfFile( m_hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0 );
170  if ( nullptr == m_pView ) {
171  // マッピングをクローズする
172  ::CloseHandle( m_hMapping );
173  m_hMapping = nullptr;
174 
175  // 失敗!
176  break;
177  }
178 
179  // 成功!
180  result = true;
181  } while ( false );
182 
183  // 実行結果を調べる
184  if ( !result ) {
185  // ミューテックスをクローズする
186  CMutex::Close();
187  }
188  } while ( false );
189 
190  // 実行結果を返す
191  return result;
192  }
193 
194  //=====================================================================
195  // 静的限定公開文字列定数
196  wchar_t const* const CMapping::OBJECT_NAME_EXT = L".CMapping";
197 }
198 
199 #pragma managed( pop )
LPVOID m_pView
ビューポインタ
Definition: CMapping.h:131
CMapping() noexcept
コンストラクタ
Definition: CMapping.cpp:29
bool m_bIsCreate
新規作成フラグ
Definition: CSync.h:153
virtual ~CMapping() noexcept
デストラクタ
Definition: CMapping.cpp:39
共通ライブラリ名前空間
Definition: CArray.h:23
マッピングクラスヘッダファイル
virtual bool Create(wchar_t const *pszObjectName=nullptr) noexcept
作成関数
Definition: CMutex.cpp:143
ミューテックスクラス
Definition: CMutex.h:30
HANDLE m_hMapping
マッピングハンドル
Definition: CMapping.h:130
自動同期クラス
Definition: CSyncAuto.h:30
virtual bool Open(wchar_t const *pszObjectName) noexcept override
オープン関数
Definition: CMapping.cpp:132
virtual void Close() noexcept override
クローズ関数
Definition: CMutex.cpp:47
virtual bool Open(wchar_t const *pszObjectName) noexcept
オープン関数
Definition: CMutex.cpp:184
virtual bool Create(DWORD dwSize, wchar_t const *pszObjectName=nullptr) noexcept
作成関数
Definition: CMapping.cpp:65
自動同期クラスヘッダファイル
virtual void Close() noexcept override
クローズ関数
Definition: CMapping.cpp:48
static wchar_t const *const OBJECT_NAME_EXT
オブジェクト名拡張子
Definition: CMapping.h:125