반응형
ShellExecute(NULL, NULL, "cmd.exe", " /c 프로그램명 파라미터", NULL, SW_HIDE);
WinExec ("cmd.exe /k 프로그램명 파라미터",SW_SHOW) ;
system("프로그램명 파라미터");
// 실행을 위해 구조체 세트 ZeroMemory( &execinfo, sizeof(execinfo) ); execinfo.cbSize = sizeof(execinfo); execinfo.lpVerb = "open"; execinfo.lpFile = "cmd.exe"; execinfo.lpParameters = strPgmFileName; execinfo.fMask = SEE_MASK_FLAG_NO_UI | SEE_MASK_NOCLOSEPROCESS; execinfo.nShow = SW_HIDE; // 프로그램을 실행한다. int r = (int)ShellExecuteEx( &execinfo ); //프로세스가 종료될 때까지 무한정 기다림 WaitForSingleObject(execinfo.hProcess, INFINITE);
전역 함수 설정
HANDLE SpawnAndRedirect(LPCTSTR commandLine, HANDLE *hStdOutputReadPipe, LPCTSTR lpCurrentDirectory)
{
HANDLE hStdOutputWritePipe, hStdOutput, hStdError;
CreatePipe(hStdOutputReadPipe, &hStdOutputWritePipe, NULL, 0); // create a non-inheritable pipe
DuplicateHandle(GetCurrentProcess(), hStdOutputWritePipe,
GetCurrentProcess(), &hStdOutput, // duplicate the "write" end as inheritable stdout
0, TRUE, DUPLICATE_SAME_ACCESS);
DuplicateHandle(GetCurrentProcess(), hStdOutput,
GetCurrentProcess(), &hStdError, // duplicate stdout as inheritable stderr
0, TRUE, DUPLICATE_SAME_ACCESS);
CloseHandle(hStdOutputWritePipe); // no longer need the non-inheritable "write" end of the pipe
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); // (this is bad on a GUI app)
si.hStdOutput = hStdOutput;
si.hStdError = hStdError;
si.wShowWindow = SW_HIDE; // IMPORTANT: hide subprocess console window
TCHAR commandLineCopy[1024]; // CreateProcess requires a modifiable buffer
_tcscpy(commandLineCopy, commandLine);
if (!CreateProcess( NULL, commandLineCopy, NULL, NULL, TRUE,
CREATE_NEW_CONSOLE, NULL, lpCurrentDirectory, &si, &pi))
{
CloseHandle(hStdOutput);
CloseHandle(hStdError);
CloseHandle(*hStdOutputReadPipe);
*hStdOutputReadPipe = INVALID_HANDLE_VALUE;
return NULL;
}
CloseHandle(pi.hThread);
CloseHandle(hStdOutput);
CloseHandle(hStdError);
return pi.hProcess;
}
명령 사용시
CSvMat CSvLibLinear::train(CString strParam, CString strFileName)
{
CSvMat tt;
CString strExcute,strStartTime, argu, OutputFile,execute1;
CString strResize;
strExcute.Format("train.exe ");
HANDLE hOutput, hProcess;
//strExcute + strParam : cmd 명령, 파라미터도 가능
hProcess = SpawnAndRedirect(strExcute + strParam, &hOutput, NULL);
if (!hProcess)
return tt;
//pDlg->BeginWaitCursor();
CHAR buffer[129];
CString buff;
DWORD read;
CString str, tmp;
int LineCount=0;
//cmd 창의 출력 내용 가져오기
while (ReadFile(hOutput, buffer, 128, &read, NULL))
{
buffer[read] = '\0';
printf("%s\r\n", buffer);
}
printf(".");
CloseHandle(hOutput);
TerminateProcess(hProcess,0);
CloseHandle(hProcess);
return ReadTrainFile(strFileName+".model");
}
반응형
'Programming > MFC-C++' 카테고리의 다른 글
| Thread Pool C++ 11 (0) | 2015.05.14 |
|---|---|
| 람다 표현식(Lambda expression) (0) | 2015.05.13 |
| [Eigen] C++ Matrix Library (1) | 2015.05.12 |
| Matlab fitgeotrans function convert C++ (0) | 2015.05.08 |
| 채팅 프로그램을 위한 라이브러리 Socket.IO C++ (0) | 2015.04.16 |