Windows执行CMD命令获取执行结果

2019-12-27  本文已影响0人  Virtualer

MFC开发中经常需要执行CMD命令,有时候更需要获取命令的执行结果。一般两种方式:

  • 使用ShellExecute执行命令,命令中使用> text.txt将结果输出到text.txt中,再读取text.txt中的信息(Windows带参数执行程序);
  • 使用CreateProcess执行,使用管道接收;

本文主要阐述一下第二种。

// Function : CString转TCHAR*
// Parameter : CString类型的待转换字符串
// Return : TCHAR类型指针
TCHAR* StringToChar(CString& str)
{
    int len=str.GetLength();
    TCHAR* tr=str.GetBuffer(len);
    str.ReleaseBuffer();
    return tr; 
}

// Function : 执行CMD命令
// Parameter : CString类型的命令
// Return : CString类型的CMD命令返回值
CString ExecuteCmd(CString str)
{
    SECURITY_ATTRIBUTES sa;
    HANDLE hRead,hWrite;
 
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.lpSecurityDescriptor = NULL;
    sa.bInheritHandle = TRUE;
    if (!CreatePipe(&hRead, &hWrite, &sa, 0))
    {
        return NULL;
    }
    STARTUPINFO si={sizeof(si)};
    PROCESS_INFORMATION pi;
    si.hStdError = hWrite;
    si.hStdOutput = hWrite;
    si.wShowWindow = SW_HIDE;
    si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
    TCHAR* cmdline=StringToChar(str);
    if (!CreateProcess(NULL, cmdline, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi))
    {
        return NULL;
    }
    CloseHandle(hWrite);
 
    char buffer[4096];
    memset(buffer,0,4096);
    CString output;
    DWORD byteRead;
    while(true)
    {
        if (ReadFile(hRead, buffer, 4095, &byteRead, NULL) == NULL)
        {
            break;
        }
        output += buffer;
    }
    return output;
}

代码来源:https://blog.csdn.net/waitig1992/article/details/23766833

上一篇下一篇

猜你喜欢

热点阅读