댓글 쓰기 권한이 없습니다. 로그인 하시겠습니까?
MFC
2007.08.14 09:48
시스템 출력 리디렉션 - 도스 커맨드 결과 받아오기
조회 수 55433 댓글 0
종종 dos 커맨드를 사용하기 위해서 system 함수를 쓸 일이 있다. 하지만 system 함수 를 사용하게 되면 command 창이 떠서 해당 결과를 출력해 버린다. 결과가 없는 경우라 하더라고 command 창이 떴다 사라지기 때문에 이상하게 보일 수 있다. 이럴때, command 출력을 리디렉션 시키는 방법을 사용하면 손쉽게 문제를 해결 할 수 있다. 아래 함수가 그러한 역할을 한다. lpszCmd로 전송된 커맨드를 실행시키고, lpszBuffer에 결과를 담아준다. 01: BOOL CmdRun(LPSTR lpszCmd, LPSTR *lpszBuffer) 02: { 03: PROCESS_INFORMATION pi; 04: STARTUPINFO si; 05: BOOL bCreated = FALSE; 06: SECURITY_ATTRIBUTES sa; 07: 08: memset(&pi, 0, sizeof(PROCESS_INFORMATION)); 09: memset(&si, 0, sizeof(STARTUPINFO)); 10: memset(&sa, 0, sizeof(SECURITY_ATTRIBUTES)); 11: 12: sa.nLength = sizeof(SECURITY_ATTRIBUTES); 13: sa.bInheritHandle = TRUE; 14: char szCmdOut[255]; 15: sprintf(szCmdOut, "c:\\cmd%ld_out.txt", GetCurrentThreadId()); 16: HANDLE hFile = CreateFile(szCmdOut, GENERIC_WRITE, 0, &sa, CREATE_ALWAYS , 17: FILE_ATTRIBUTE_NORMAL, NULL); 18: if( hFile == INVALID_HANDLE_VALUE ) 19: { 20: printf("CreateFile cmd_out.txt failed\n"); 21: return FALSE; 22: } 23: 24: char szCmd[255]; 25: sprintf(szCmd, "c:\\cmd%ld.cmd", GetCurrentThreadId()); 26: HANDLE hCmdFile = CreateFile(szCmd, GENERIC_WRITE, 0, &sa, CREATE_ALWAYS , 27: FILE_ATTRIBUTE_NORMAL, NULL); 28: if( hCmdFile == INVALID_HANDLE_VALUE ) 29: { 30: printf("CreateFile cmd.cmd failed\n"); 31: return FALSE; 32: } 33: DWORD dwSize = 0; 34: WriteFile(hCmdFile, lpszCmd,strlen(lpszCmd), &dwSize,NULL); 35: CloseHandle(hCmdFile); 36: 37: si.cb = sizeof(STARTUPINFO); 38: si.dwFlags = STARTF_USESTDHANDLES; 39: si.hStdOutput = hFile; 40: si.hStdInput = hFile; 41: si.hStdError = hFile; 42: 43: bCreated = CreateProcess(NULL, szCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); 44: if( bCreated==FALSE ) 45: { 46: printf("CreateProcess failed\n"); 47: return FALSE; 48: } 49: WaitForSingleObject(pi.hProcess, INFINITE); 50: CloseHandle(pi.hProcess); 51: CloseHandle(pi.hThread); 52: CloseHandle(hFile); 53: 54: HANDLE hReadCmdFile = CreateFile(szCmdOut, GENERIC_READ, 0, &sa, 55: OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 56: dwSize=GetFileSize(hReadCmdFile,NULL); 57: 58: *lpszBuffer = new char[dwSize+1]; 59: memset(*lpszBuffer, 0, dwSize); 60: DWORD dwRead = 0; 61: ReadFile(hReadCmdFile,*lpszBuffer,dwSize,&dwRead,NULL); 62: *(*lpszBuffer+dwRead) = 0; 63: 64: CloseHandle(hReadCmdFile); 65: 66: DeleteFile(szCmd); 67: DeleteFile(szCmdOut); 68: 69: return TRUE; 70: } 아래와 같이 사용하면 된다. TCHAR *buffer; CmdRun("dir", &buffer); printf("%s", buffer); CmdRun("ping 168.126.63.1", &buffer); printf("%s", buffer);
Dreamy의 코드 스크랩내가 모으고 내가 보는
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Designed by sketchbooks.co.kr / sketchbook5 board skin
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5
Sketchbook5, 스케치북5