Solution46
CProcess.cpp
[詳解]
1 //=============================================================================
2 /// @file
3 /// プロセスクラス実装ファイル
4 ///
5 /// プロセスクラス実装ファイルです。
6 ///
7 /// $Id: CProcess.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 <CProcess.h>
18 
19 //=============================================================================
20 // 共通ライブラリ名前空間
21 namespace LibCommon {
22  //=========================================================================
23  // プロセスクラス
24  //=========================================================================
25  // 構築子と解体子
26  //-------------------------------------------------------------------------
27  // コンストラクタ
28  CProcess::CProcess() noexcept
29  // 基底クラスコンストラクタ
30  : CSync()
31  // メンバ変数初期化
32  , m_dwProcessId( 0 )
33  {}
34 
35  //-------------------------------------------------------------------------
36  // デストラクタ
37  CProcess::~CProcess() noexcept {
38  // クローズする
39  Close();
40  }
41 
42  //=========================================================================
43  // 公開関数
44  //-------------------------------------------------------------------------
45  // クローズ関数
46  void CProcess::Close() noexcept {
47  // 基底クラスの関数を実行する
48  CSync::Close();
49 
50  // メンバ変数を初期化する
51  m_dwProcessId = 0;
52  }
53 
54  //-------------------------------------------------------------------------
55  // リリース関数
56  bool CProcess::Release() noexcept {
57  // 強制終了する
58  return Terminate();
59  }
60 
61  //-------------------------------------------------------------------------
62  // 作成関数
63  bool CProcess::Create( wchar_t const* pszPath, wchar_t const* pszArgument ) noexcept {
64  // 処理ブロック
65  bool result = false;
66  do {
67  // 実行ファイルパスを調べる
68  if ( nullptr == pszPath ) {
69  // 失敗!
70  break;
71  }
72  // プロセスハンドルを調べる
73  else if ( nullptr != m_hObject ) {
74  // クローズする
75  Close();
76  }
77 
78  // 実行ファイルパスをコピーする
79  wchar_t szBuffer[ MAX_PATH ];
80  ::wcscpy_s( szBuffer, pszPath );
81 
82  // 引数文字列を調べる
83  if ( nullptr != pszArgument ) {
84  // 引数文字列を追加する
85  ::wcscat_s( szBuffer, L" \"" );
86  ::wcscat_s( szBuffer, pszArgument );
87  ::wcscat_s( szBuffer, L"\"" );
88  }
89 
90  // プロセスを作成する
91  STARTUPINFOW sStartupInfo = {};
92  PROCESS_INFORMATION sProcessInfo = {};
93  if ( 0 == ::CreateProcessW( nullptr, szBuffer, nullptr, nullptr, false, CREATE_NEW_CONSOLE, nullptr, nullptr, &sStartupInfo, &sProcessInfo ) ) {
94  // 失敗!
95  break;
96  }
97 
98  // プロセスハンドルを取得する
99  m_hObject = sProcessInfo.hProcess;
100 
101  // プロセスIDを取得する
102  m_dwProcessId = sProcessInfo.dwProcessId;
103 
104  // 成功!
105  result = true;
106  } while ( false );
107 
108  // 実行結果を返す
109  return result;
110  }
111 
112  //-------------------------------------------------------------------------
113  // オープン関数
114  bool CProcess::Open( DWORD dwProcessId, DWORD dwAccess ) noexcept {
115  // 処理ブロック
116  bool result = false;
117  do {
118  // プロセスハンドルを調べる
119  if ( nullptr != m_hObject ) {
120  // クローズする
121  Close();
122  }
123 
124  // プロセスをオープンする
125  m_hObject = ::OpenProcess( dwAccess, false, dwProcessId );
126  if ( nullptr == m_hObject ) {
127  // 失敗!
128  break;
129  }
130 
131  // プロセスIDを設定する
132  m_dwProcessId = dwProcessId;
133 
134  // 成功!
135  result = true;
136  } while ( false );
137 
138  // 実行結果を返す
139  return result;
140  }
141 
142  //-------------------------------------------------------------------------
143  // 強制終了関数
144  bool CProcess::Terminate( DWORD dwExitCode ) noexcept {
145  // 処理ブロック
146  bool result = false;
147  do {
148  // プロセスを強制終了する
149  if ( 0 == ::TerminateProcess( m_hObject, dwExitCode ) ) {
150  // 失敗!
151  break;
152  }
153 
154  // 成功!
155  result = true;
156  } while ( false );
157 
158  // 実行結果を返す
159  return result;
160  }
161 
162  //-------------------------------------------------------------------------
163  // 終了コード取得関数
164  DWORD CProcess::GetExitCode() const noexcept {
165  // 処理ブロック
166  DWORD result = 0;
167  do {
168  // プロセス終了コードを取得する
169  DWORD dwExitCode;
170  if ( 0 == ::GetExitCodeProcess( m_hObject, &dwExitCode ) ) {
171  // 失敗!
172  break;
173  }
174 
175  // 成功!
176  result = dwExitCode;
177  } while ( false );
178 
179  // 実行結果を返す
180  return result;
181  }
182 }
183 
184 #pragma managed( pop )
virtual void Close() noexcept
クローズ関数
Definition: CSync.cpp:45
virtual void Close() noexcept override
クローズ関数
Definition: CProcess.cpp:46
virtual DWORD GetExitCode() const noexcept
終了コード取得関数
Definition: CProcess.cpp:164
virtual bool Terminate(DWORD dwExitCode=0) noexcept
強制終了関数
Definition: CProcess.cpp:144
同期クラス
Definition: CSync.h:30
virtual ~CProcess() noexcept
デストラクタ
Definition: CProcess.cpp:37
プロセスクラスヘッダファイル
共通ライブラリ名前空間
Definition: CArray.h:23
virtual bool Open(DWORD dwProcessId, DWORD dwAccess=SYNCHRONIZE) noexcept
オープン関数
Definition: CProcess.cpp:114
virtual bool Release() noexcept override
リリース関数
Definition: CProcess.cpp:56
HANDLE m_hObject
オブジェクトハンドル
Definition: CSync.h:152
DWORD m_dwProcessId
プロセスID
Definition: CProcess.h:152
CProcess() noexcept
コンストラクタ
Definition: CProcess.cpp:28
virtual bool Create(wchar_t const *pszPath, wchar_t const *pszArgument=nullptr) noexcept
作成関数
Definition: CProcess.cpp:63