这是参考别人的 ,具体来源忘了,唉,等想起来一定补上出处
头文件
PipeCmd.h
#ifndef _PIPE_CMD_H_
#define _PIPE_CMD_H_#include <Windows.h>// 执行 cmd 命令, 并获取执行结果数据
BOOL PipeCmd(char *pszCmd, char *pszResultBuffer, DWORD dwResultBufferSize);#endif
cpp文件
#include "stdafx.h"
#include "PipeCmd.h"void ShowError(char *pszText)
{char szErr[MAX_PATH] = {0};::wsprintf(szErr, "%s Error[%d]\n", 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;
}
使用:
string getVideoInfoParam = appPath.toStdString() + "\\ffmpeg.exe -i \"" + filePath + "\"" ;
// getVideoInfoParam 是要执行的命令
// szResultBuffer 命令输出结果存储在这里
char szResultBuffer[2560] = { 0 };
DWORD dwResultBufferSize = 2560;
string videoInfoStr;
// 执行 cmd 命令, 并获取执行结果数据
if (FALSE == PipeCmd(const_cast<char *>(getVideoInfoParam.c_str()), szResultBuffer, dwResultBufferSize)) {//videoInfoStr = szResultBuffer;//QMessageBox::information(NULL, QString::fromLocal8Bit("video info error"), QString::fromStdString(videoInfoStr), QMessageBox::Yes, QMessageBox::Yes);
}
else {videoInfoStr = szResultBuffer;//QMessageBox::information(NULL, QString::fromLocal8Bit("video info"), QString::fromStdString(videoInfoStr), QMessageBox::Yes, QMessageBox::Yes);
}