zoukankan      html  css  js  c++  java
  • C++ 执行cmd命令 并读取输出

    出处:https://blog.csdn.net/weixin_43903378/article/details/105297406

    头文件

    #ifndef _PIPE_CMD_H_
    #define _PIPE_CMD_H_
    
    
    #include <Windows.h>
    
    
    // 执行 cmd 命令, 并获取执行结果数据
    BOOL PipeCmd(char *pszCmd, char *pszResultBuffer, DWORD dwResultBufferSize);
    
    
    #endif

    源文件

    #include "stdafx.h"
    #include "PipeCmd.h"
    
    
    void ShowError(char *pszText)
    {
        char szErr[MAX_PATH] = {0};
        ::wsprintf(szErr, "%s Error[%d]
    ", pszText, ::GetLastError());
        ::MessageBox(NULL, szErr, "ERROR", MB_OK);
    }
    
    
    // 执行 cmd 命令, 并获取执行结果数据
    BOOL PipeCmd(char *pszCmd, char *pszResultBuffer, DWORD dwResultBufferSize)
    {
        HANDLE hReadPipe = NULL;
        HANDLE hWritePipe = NULL;
        SECURITY_ATTRIBUTES securityAttributes = {0};
        BOOL bRet = FALSE;
        STARTUPINFO si = {0};
        PROCESS_INFORMATION pi = {0};
    
        // 设定管道的安全属性
        securityAttributes.bInheritHandle = TRUE;
        securityAttributes.nLength = sizeof(securityAttributes);
        securityAttributes.lpSecurityDescriptor = NULL;
        // 创建匿名管道
        bRet = ::CreatePipe(&hReadPipe, &hWritePipe, &securityAttributes, 0);
        if (FALSE == bRet)
        {
            ShowError("CreatePipe");
            return FALSE;
        }
        // 设置新进程参数
        si.cb = sizeof(si);
        si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
        si.wShowWindow = SW_HIDE;
        si.hStdError = hWritePipe;
        si.hStdOutput = hWritePipe;
        // 创建新进程执行命令, 将执行结果写入匿名管道中
        bRet = ::CreateProcess(NULL, pszCmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
        if (FALSE == bRet)
        {
            ShowError("CreateProcess");
        }
        // 等待命令执行结束
        ::WaitForSingleObject(pi.hThread, INFINITE);
        ::WaitForSingleObject(pi.hProcess, INFINITE);
        // 从匿名管道中读取结果到输出缓冲区
        ::RtlZeroMemory(pszResultBuffer, dwResultBufferSize);
        ::ReadFile(hReadPipe, pszResultBuffer, dwResultBufferSize, NULL, NULL);
        // 关闭句柄, 释放内存
        ::CloseHandle(pi.hThread);
        ::CloseHandle(pi.hProcess);
        ::CloseHandle(hWritePipe);
        ::CloseHandle(hReadPipe);
    
        return TRUE;
    }
  • 相关阅读:
    【转】十分钟了结MySQL information_schema
    【转】CentOS6.5下Redis安装与配置
    java知识点
    【转】STRING使用EQUALS方法和==分别比较的是什么
    【转】JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解
    【转】mybatis入门基础(六)----高级映射(一对一,一对多,多对多)
    【转】mybatis中的#和$的区别
    【转】HashMap
    【转】@Transactional事务几点注意
    关于PC端的密码框自动获取浏览器保存密码的问题[vue]
  • 原文地址:https://www.cnblogs.com/liujx2019/p/14325584.html
Copyright © 2011-2022 走看看