MFC byDreamy postedAug 14, 2007

시스템 출력 리디렉션 - 도스 커맨드 결과 받아오기

?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

+ - Up Down Comment Print
종종 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);

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5