MFC 명령 프롬프트(CMD) 실행 및 결과 스트링 반환

Develop2018. 11. 30. 18:43




윈도우 개발 시 명령 프롬프트 창을 숨겨 실행하고, 결과 스트링 값을 이용 해야 할 때가 종종 발생합니다.


ExecCommand 함수는 원하는 명령 프롬프트를 실행하고 실행 결과 값을 스트링 문자열로 반환하는 함수입니다. 이 함수를 통해 시스템 변수를 읽거나, 자바 또는 파이썬 스크립트를 실행하고, 자신이 만든 배치파일 등을 실행 할 수 있습니다. 함수 사용 시 파라미터에 띄어쓰기가 포함되어 이중따움표( " )를 사용해야 하는 경우는 ( \" )와 같이 사용합니다. 아래 함수 사용 예를 참고하면 되겠습니다.



ExecCommand 함수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
std::string ExecCommand(std::string szCmdArg)
{
    std::string szResult;
 
    HANDLE hChildStdoutRd;
    HANDLE hChildStdoutWr;
 
    BOOL fSuccess;
 
    // Create security attributes to create pipe.
    SECURITY_ATTRIBUTES saAttr = { sizeof(SECURITY_ATTRIBUTES) };
    saAttr.bInheritHandle = TRUE;
    saAttr.lpSecurityDescriptor = NULL;
 
    // Create a pipe to get results from child's stdout.
    if (!CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0))
    {
        return szResult;
    }
 
    STARTUPINFOA si = { sizeof(STARTUPINFO) };
 
    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    si.hStdOutput = hChildStdoutWr;
    si.hStdError = hChildStdoutWr;
    si.wShowWindow = SW_HIDE;
 
    PROCESS_INFORMATION pi = { 0 };
 
    // Create the child process.
    fSuccess = CreateProcessA(
        NULL,
        (LPSTR)szCmdArg.c_str(),    // command line
        NULL,                       // process security attributes
        NULL,                       // primary thread security attributes
        TRUE,                       // TRUE=handles are inherited. Required.
        CREATE_NEW_CONSOLE,         // creation flags
        NULL,                       // use parent's environment
        NULL,                       // use parent's current directory
        &si,                        // __in, STARTUPINFO pointer
        &pi);                       // __out, receives PROCESS_INFORMATION
 
    if (!fSuccess)
    {
        return szResult;
    }
 
    // Wait until child processes exit. Don't wait forever.
    WaitForSingleObject(pi.hProcess, 2000);
    TerminateProcess(pi.hProcess, 0);
 
    if (!CloseHandle(hChildStdoutWr))
    {
        return szResult;
    }
 
    for (;;)
    {
        DWORD dwRead;
        CHAR chBuf[4096];
 
        bool done = !ReadFile(hChildStdoutRd, chBuf, 4096&dwRead, NULL|| dwRead == 0;
        if (done)
        {
            break;
        }
 
        szResult += chBuf;
    }
 
    CloseHandle(hChildStdoutRd);
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
 
    return szResult;
}
cs



함수 사용 예

1
2
std::string szResult = ExecCommand("python --version");
std::string szResult = ExecCommand("test.bat \"첫 번째 파라미터\" \"두 번째 파리미터\"");
cs




참고: https://snipplr.com/view/35935/

작성자

Posted by GLORY PAPA

관련 글

댓글 영역