Develop and Download Open Source Software

Browse Subversion Repository

Contents of /CopalPro/ExecProc.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations) (download) (as text)
Thu Jul 28 09:05:52 2011 UTC (12 years, 9 months ago) by kaityo
File MIME type: text/x-c++src
File size: 13264 byte(s)
First Commit
1 //---------------------------------------------------------------------------
2 #include <vcl.h>
3 #pragma hdrstop
4
5 #include "Main.h"
6 #include "ExecProc.h"
7
8 //---------------------------------------------------------------------------
9 #pragma package(smart_init)
10 //---------------------------------------------------------------------------
11 bool TFMain::ExecProcess(AnsiString Cmd) {
12 //プロセスの実行
13
14 HANDLE hwrite,hread;
15 HANDLE hwrite2,hread2;//エラー出力を取る
16
17 SECURITY_ATTRIBUTES sa,sa2;
18 //SECURITY_DESCRIPTOR sd,sd2;
19 sa.nLength = sizeof(SECURITY_ATTRIBUTES);
20 sa.lpSecurityDescriptor = NULL;
21 sa.bInheritHandle = true;
22
23 sa2.nLength = sizeof(SECURITY_ATTRIBUTES);
24 sa2.lpSecurityDescriptor = NULL;
25 sa2.bInheritHandle = true;
26
27 bool flagStdOut = CreatePipe(&hread,&hwrite,&sa,0);
28
29 bool flagStdErr = CreatePipe(&hread2,&hwrite2,&sa2,0);
30
31 if (!flagStdOut && !flagStdErr) {
32 ShowMessage("fail to open pipe (both)\n");
33 return false;
34 }
35
36 if (!flagStdOut) {
37 ShowMessage("fail to open pipe (StdOut)\n");
38 return false;
39 }
40
41 if (!flagStdErr) {
42 ShowMessage("fail to open pipe (StdErr)\n");
43 return false;
44 }
45
46 STARTUPINFO si;
47 si.cb = sizeof(STARTUPINFO);
48 si.lpReserved = NULL;
49 si.lpReserved2 = NULL;
50 si.cbReserved2 = 0;
51 si.lpDesktop = NULL;
52 si.lpTitle = NULL;
53 si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
54 si.wShowWindow = SW_HIDE;
55 si.hStdOutput = hwrite;
56 si.hStdError = hwrite2;
57
58 PROCESS_INFORMATION pi;
59
60
61 bool flag = CreateProcess(
62 NULL,
63 Cmd.c_str(),
64 NULL,
65 NULL,
66 true,
67 NORMAL_PRIORITY_CLASS|DETACHED_PROCESS,
68 NULL,
69 GetCurrentDir().c_str(),
70 &si,
71 &pi);
72
73 if (!flag) {
74 ShowMessage("fail to create process\n");
75 return false;
76 }
77
78 Sleep(300);
79
80 CloseHandle(hwrite);
81 CloseHandle(hwrite2);
82
83 DWORD exitcode = 1;
84
85 char buffer[4097]; //標準出力用
86 char buffer2[4097];//エラー用
87
88 DWORD readbuf;
89 DWORD readbuf2;
90
91 DWORD tryread;
92 DWORD tryread2;
93
94 bool flag_read,flag_read2;
95
96 SetLastError(-1);
97
98 //ストリームの準備
99 TMemoryStream *msStdOut = new TMemoryStream;//標準出力用
100 TMemoryStream *msStdErr = new TMemoryStream;//標準エラー用
101
102 msStdOut->Clear();
103 msStdErr->Clear();
104 //プロセスを監視する無限メインループ
105
106 while(1) {
107 if(GetExitCodeProcess(pi.hProcess,&exitcode)==false) {
108 ShowMessage("Error:Fail to ExitCodeProcess\n");
109 break;
110 }
111
112 if (exitcode ==STILL_ACTIVE) {
113 if (GetAsyncKeyState(VK_ESCAPE)<0) {
114 ShowMessage("処理は中断されました");
115 break;
116 }
117
118 PeekNamedPipe(hread,NULL,NULL,NULL,&readbuf,NULL);
119
120 if(readbuf > sizeof(buffer)-1)
121 tryread = sizeof(buffer)-1;
122 else
123 tryread = readbuf;
124
125 flag_read = ReadFile(hread,buffer,tryread,&readbuf,NULL);
126
127 if(flag_read) {
128 if(readbuf) {
129 msStdOut->Write(buffer,readbuf);
130 }
131 }
132
133 PeekNamedPipe(hread2,NULL,NULL,NULL,&readbuf2,NULL);
134 if(readbuf2 > sizeof(buffer2)-1)
135 tryread2 = sizeof(buffer2)-1;
136 else
137 tryread2 = readbuf2;
138
139 flag_read2 = ReadFile(hread2,buffer2,tryread2,&readbuf2,NULL);
140
141 if(flag_read2) {
142 if(readbuf2) {
143 msStdErr->Write(buffer2,readbuf2);
144 }
145 }
146 } else
147 break;
148 //if(!flag_stdout && !flag_stderror)break;
149 }
150
151 //プロセス終了後の処理
152
153 //残りのデータをパイプから取ってくる
154
155 DWORD bread = -1;
156 DWORD canread = 0;
157
158 PeekNamedPipe(hread,NULL,NULL,NULL,&canread,NULL);
159 char *pbuffer;
160
161 if(canread!=0) {
162 pbuffer = new char[canread + 1];
163 ReadFile(hread,pbuffer,canread,&bread,NULL);
164 msStdOut->Write(pbuffer,bread);
165 delete pbuffer;
166 }
167
168 DWORD bread2 = -1;
169 DWORD canread2 = 0;
170
171
172 PeekNamedPipe(hread2,NULL,NULL,NULL,&canread2,NULL);
173 char *pbuffer2;
174
175 if(canread2!=0) {
176 pbuffer2 = new char[canread2 + 1];
177 ReadFile(hread2,pbuffer2,canread2,&bread2,NULL);
178 msStdErr->Write(pbuffer2,bread2);
179 delete pbuffer2;
180 }
181
182 CloseHandle(hread);
183 CloseHandle(hread2);
184
185 if(GetExitCodeProcess(pi.hProcess,&exitcode)==false) {
186 ShowMessage("Error:Fail to ExitCodeProcess\n");
187 return false;
188 }
189
190
191 msStdOut->Position = 0;
192 if(msStdOut->Size !=0)
193 REStdOut->Lines->LoadFromStream(msStdOut);
194 else
195 REStdOut->Clear();
196
197 msStdErr->Position = 0;
198 if(msStdErr->Size !=0)
199 REStdErr->Lines->LoadFromStream(msStdErr);
200 else
201 REStdErr->Clear();
202
203 delete msStdOut;
204 delete msStdErr;
205
206 //エラーがあった時の処理
207 if (exitcode!=0) {
208 ShowMessage("エラーが存在します Error Code = "+IntToStr(exitcode));
209 return false;
210 }
211
212 return true;
213 }
214 //---------------------------------------------------------------------------
215 bool TFMain::ExecProc(AnsiString Cmd) {
216 //SECURITY_ATTRIBUTEの設定
217
218 SECURITY_ATTRIBUTES saStdOut,saStdErr;
219 saStdOut.nLength = sizeof( SECURITY_ATTRIBUTES );
220 saStdOut.bInheritHandle = true;
221 saStdOut.lpSecurityDescriptor = NULL;
222
223 saStdErr.nLength = sizeof( SECURITY_ATTRIBUTES );
224 saStdErr.bInheritHandle = true;
225 saStdErr.lpSecurityDescriptor = NULL;
226
227 //このプロセスのSTDOUT,STDERRハンドルの保存
228 HANDLE hSaveStdout = GetStdHandle(STD_OUTPUT_HANDLE);
229 HANDLE hSaveStderr = GetStdHandle(STD_ERROR_HANDLE);
230
231 //子プロセスへのパイプをつくる。
232 HANDLE hStdOutWriteEnd,hStdOutReadEnd;
233 HANDLE hStdErrWriteEnd,hStdErrReadEnd;
234
235 if (!CreatePipe(&hStdOutReadEnd, &hStdOutWriteEnd, &saStdOut, 0)) {
236 ShowMessage("Cannot create a Pipe(StdOut)");
237 }
238 if (!CreatePipe(&hStdErrReadEnd, &hStdErrWriteEnd, &saStdErr, 0)) {
239 ShowMessage("Cannot create a Pipe(StdErr)");
240 }
241
242 PROCESS_INFORMATION pi;
243 STARTUPINFO si;
244 GetStartupInfo(&si);
245 si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
246 si.wShowWindow = SW_HIDE;
247 si.hStdOutput = hStdOutWriteEnd;
248 si.hStdError = hStdErrWriteEnd;
249
250 //プロセスの作成
251 if (!CreateProcess(NULL,Cmd.c_str(), NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {
252 ShowMessage("Cannot create a process.");
253 }
254 // このプロセスの標準出力を元に戻す。
255 if (!SetStdHandle(STD_OUTPUT_HANDLE, hSaveStdout)) {
256 ShowMessage("Cannot Restore STDOUT.");
257 }
258 if (!SetStdHandle(STD_ERROR_HANDLE, hSaveStderr)) {
259 ShowMessage("Cannot restore STDERR.");
260 }
261 //パイプから読み込む前に書き込み端を閉じる。
262 if ( !CloseHandle( hStdOutWriteEnd) ) {
263 ShowMessage("Cannot close stdout write end.");
264 }
265 if ( !CloseHandle( hStdErrWriteEnd) ) {
266 ShowMessage("Cannot close stderr write end.");
267 }
268
269 //パイプ読み込みの準備
270
271 DWORD exitcode = 1;//終了フラグ
272 char bufStdOut[4097],bufStdErr[4097];//読み込みbuffer
273 DWORD readbufStdOut = 0,readbufStdErr = 0;//読み込んだバイト数
274 DWORD tryreadStdOut,tryreadStdErr;//読み込みに行くバイト数
275 bool flagStdOut = true,flagStdErr = true;//読み込めたかどうか
276
277 SetLastError(-1);
278
279 //ストリームの準備
280 TMemoryStream *msStdOut = new TMemoryStream;//標準出力用
281 TMemoryStream *msStdErr = new TMemoryStream;//標準エラー用
282 msStdOut->Clear();
283 msStdErr->Clear();
284
285 //プロセスを監視する無限メインループ
286
287 while(1) {
288
289 //exitcodeを調べる
290 if(GetExitCodeProcess(pi.hProcess,&exitcode)==false) {
291 ShowMessage("Error:Fail to ExitCodeProcess\n");
292 break;
293 }
294
295 if (exitcode !=STILL_ACTIVE)
296 break;
297
298 if (GetAsyncKeyState(VK_ESCAPE)<0) {
299 ShowMessage("処理は中断されました");
300 break;
301 }
302
303 do {
304 if(!ReadFile(hStdOutReadEnd,bufStdOut,sizeof(bufStdOut),&readbufStdOut,NULL))
305 break;
306 if(readbufStdOut) {
307 msStdOut->Write(bufStdOut,readbufStdOut);
308 }
309 } while(readbufStdOut!=0);
310
311
312 if(!ReadFile(hStdErrReadEnd,bufStdErr,sizeof(bufStdErr),&readbufStdErr,NULL))
313 break;
314 if(readbufStdErr) {
315 msStdErr->Write(bufStdErr,readbufStdErr);
316 }
317
318 /*
319 //標準出力を調べる
320
321 if(flagStdOut)
322 {
323 flagStdOut = ReadFile(hStdOutReadEnd,bufStdOut,sizeof(bufStdOut),&readbufStdOut,NULL);
324
325 if(flagStdOut)
326 {
327 if(readbufStdOut)
328 {
329 msStdOut->Write(bufStdOut,readbufStdOut);
330 }
331 }
332 }
333 //標準エラー出力を調べる
334 if(flagStdErr)
335 {
336
337 flagStdErr = ReadFile(hStdErrReadEnd,bufStdErr,sizeof(bufStdErr),&readbufStdErr,NULL);
338 if(readbufStdErr)
339 {
340 msStdErr->Write(bufStdErr,readbufStdErr);
341 }
342 }
343 */
344 }
345
346 ShowMessage("Exit");
347 //プロセス終了後の処理
348
349 CloseHandle(hStdOutReadEnd);
350 CloseHandle(hStdErrReadEnd);
351
352 if(GetExitCodeProcess(pi.hProcess,&exitcode)==false) {
353 ShowMessage("Error:Fail to ExitCodeProcess\n");
354 return false;
355 }
356
357 msStdOut->Position = 0;
358 if(msStdOut->Size !=0)
359 REStdOut->Lines->LoadFromStream(msStdOut);
360 else
361 REStdOut->Clear();
362
363 msStdErr->Position = 0;
364 if(msStdErr->Size !=0)
365 REStdErr->Lines->LoadFromStream(msStdErr);
366 else
367 REStdErr->Clear();
368
369
370 delete msStdOut;
371 delete msStdErr;
372
373 return true;
374 }
375 //---------------------------------------------------------------------------
376 bool TFMain::ExecProcBak(AnsiString Cmd) {
377 //SECURITY_ATTRIBUTEの設定
378
379 SECURITY_ATTRIBUTES saStdOut,saStdErr;
380 saStdOut.nLength = sizeof( SECURITY_ATTRIBUTES );
381 saStdOut.bInheritHandle = true;
382 saStdOut.lpSecurityDescriptor = NULL;
383
384 saStdErr.nLength = sizeof( SECURITY_ATTRIBUTES );
385 saStdErr.bInheritHandle = true;
386 saStdErr.lpSecurityDescriptor = NULL;
387
388 //このプロセスのSTDOUT,STDERRハンドルの保存
389 HANDLE hSaveStdout = GetStdHandle(STD_OUTPUT_HANDLE);
390 HANDLE hSaveStderr = GetStdHandle(STD_ERROR_HANDLE);
391
392 //子プロセスへのパイプをつくる。
393 HANDLE hStdOutWriteEnd,hStdOutReadEnd;
394 HANDLE hStdErrWriteEnd,hStdErrReadEnd;
395
396 if (!CreatePipe(&hStdOutReadEnd, &hStdOutWriteEnd, &saStdOut, 0)) {
397 ShowMessage("Cannot create a Pipe(StdOut)");
398 }
399 if (!CreatePipe(&hStdErrReadEnd, &hStdErrWriteEnd, &saStdErr, 0)) {
400 ShowMessage("Cannot create a Pipe(StdErr)");
401 }
402
403 PROCESS_INFORMATION pi;
404 STARTUPINFO si;
405 GetStartupInfo(&si);
406 si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
407 si.wShowWindow = SW_HIDE;
408 si.hStdOutput = hStdOutWriteEnd;
409 si.hStdError = hStdOutWriteEnd;
410
411 //プロセスの作成
412 if (!CreateProcess(NULL,Cmd.c_str(), NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {
413 ShowMessage("Cannot create a process.");
414 }
415 // このプロセスの標準出力を元に戻す。
416 if (!SetStdHandle(STD_OUTPUT_HANDLE, hSaveStdout)) {
417 ShowMessage("Cannot Restore STDOUT.");
418 }
419 if (!SetStdHandle(STD_ERROR_HANDLE, hSaveStderr)) {
420 ShowMessage("Cannot restore STDERR.");
421 }
422 //パイプから読み込む前に書き込み端を閉じる。
423 if ( !CloseHandle( hStdOutWriteEnd) ) {
424 ShowMessage("Cannot close stdout write end.");
425 }
426 if ( !CloseHandle( hStdErrWriteEnd) ) {
427 ShowMessage("Cannot close stderr write end.");
428 }
429
430 //パイプ読み込みの準備
431
432 DWORD exitcode = 1;//終了フラグ
433 char bufStdOut[4097],bufStdErr[4097];//読み込みbuffer
434 DWORD readbufStdOut,readbufStdErr;//読み込んだバイト数
435 DWORD tryreadStdOut,tryreadStdErr;//読み込みに行くバイト数
436 bool flagStdOut = true,flagStdErr = true;//読み込めたかどうか
437
438 SetLastError(-1);
439
440 //ストリームの準備
441 TMemoryStream *msStdOut = new TMemoryStream;//標準出力用
442 TMemoryStream *msStdErr = new TMemoryStream;//標準エラー用
443 msStdOut->Clear();
444 msStdErr->Clear();
445
446 //プロセスを監視する無限メインループ
447
448 while(1) {
449
450 //exitcodeを調べる
451 if(GetExitCodeProcess(pi.hProcess,&exitcode)==false) {
452 ShowMessage("Error:Fail to ExitCodeProcess\n");
453 break;
454 }
455
456 if (exitcode !=STILL_ACTIVE)
457 break;
458
459 if (GetAsyncKeyState(VK_ESCAPE)<0) {
460 ShowMessage("処理は中断されました");
461 break;
462 }
463
464 //標準出力を調べる
465
466 if(flagStdOut) {
467
468 flagStdOut = ReadFile(hStdOutReadEnd,bufStdOut,sizeof(bufStdOut),&readbufStdOut,NULL);
469
470 if(flagStdOut) {
471 if(readbufStdOut) {
472 msStdOut->Write(bufStdOut,readbufStdOut);
473 }
474 }
475 }
476 //標準エラー出力を調べる
477 if(flagStdErr) {
478
479 flagStdErr = ReadFile(hStdErrReadEnd,bufStdErr,sizeof(bufStdErr),&readbufStdErr,NULL);
480 if(readbufStdErr) {
481 msStdErr->Write(bufStdErr,readbufStdErr);
482 }
483 }
484 }
485
486 //プロセス終了後の処理
487
488 CloseHandle(hStdOutReadEnd);
489 CloseHandle(hStdErrReadEnd);
490
491 if(GetExitCodeProcess(pi.hProcess,&exitcode)==false) {
492 ShowMessage("Error:Fail to ExitCodeProcess\n");
493 return false;
494 }
495
496 msStdOut->Position = 0;
497 if(msStdOut->Size !=0)
498 REStdOut->Lines->LoadFromStream(msStdOut);
499 else
500 REStdOut->Clear();
501
502 msStdErr->Position = 0;
503 if(msStdErr->Size !=0)
504 REStdErr->Lines->LoadFromStream(msStdErr);
505 else
506 REStdErr->Clear();
507
508
509 delete msStdOut;
510 delete msStdErr;
511
512 return true;
513 }
514 //---------------------------------------------------------------------------
515

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26