C ++-Windows-如何写入&&读取命令shell

问题描述

|| 我想在Windows Shell中执行命令。我想收到结果。我试图搜索win32控制台函数。但是,我没有看到任何字符返回函数。有人可以帮我吗?我正在Qt中进行。因此,如果解决方案在Qt中,则没有问题。 注意:有什么方法可以像linux一样写入端口吗? 编辑:    在这种情况下可以使用QProcess吗?     

解决方法

        您应该创建另一个进程,执行cmd,并通过管道访问其stdin-stdout。 例如看这里     ,        我认为您正在寻找管道运行。请参阅MSDN。 来自MSDN的父流程代码:
#include <windows.h> 
#include <tchar.h>
#include <stdio.h> 
#include <strsafe.h>

#define BUFSIZE 4096 

HANDLE g_hChildStd_IN_Rd = NULL;
HANDLE g_hChildStd_IN_Wr = NULL;
HANDLE g_hChildStd_OUT_Rd = NULL;
HANDLE g_hChildStd_OUT_Wr = NULL;

HANDLE g_hInputFile = NULL;

void CreateChildProcess(void); 
void WriteToPipe(void); 
void ReadFromPipe(void); 
void ErrorExit(PTSTR); 

int _tmain(int argc,TCHAR *argv[]) 
{ 
   SECURITY_ATTRIBUTES saAttr; 

   printf(\"\\n->Start of parent execution.\\n\");

// Set the bInheritHandle flag so pipe handles are inherited. 

   saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); 
   saAttr.bInheritHandle = TRUE; 
   saAttr.lpSecurityDescriptor = NULL; 

// Create a pipe for the child process\'s STDOUT. 

   if ( ! CreatePipe(&g_hChildStd_OUT_Rd,&g_hChildStd_OUT_Wr,&saAttr,0) ) 
      ErrorExit(TEXT(\"StdoutRd CreatePipe\")); 

// Ensure the read handle to the pipe for STDOUT is not inherited.

   if ( ! SetHandleInformation(g_hChildStd_OUT_Rd,HANDLE_FLAG_INHERIT,0) )
      ErrorExit(TEXT(\"Stdout SetHandleInformation\")); 

// Create a pipe for the child process\'s STDIN. 

   if (! CreatePipe(&g_hChildStd_IN_Rd,&g_hChildStd_IN_Wr,0)) 
      ErrorExit(TEXT(\"Stdin CreatePipe\")); 

// Ensure the write handle to the pipe for STDIN is not inherited. 

   if ( ! SetHandleInformation(g_hChildStd_IN_Wr,0) )
      ErrorExit(TEXT(\"Stdin SetHandleInformation\")); 

// Create the child process. 

   CreateChildProcess();

// Get a handle to an input file for the parent. 
// This example assumes a plain text file and uses string output to verify data flow. 

   if (argc == 1) 
      ErrorExit(TEXT(\"Please specify an input file.\\n\")); 

   g_hInputFile = CreateFile(
       argv[1],GENERIC_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,NULL); 

   if ( g_hInputFile == INVALID_HANDLE_VALUE ) 
      ErrorExit(TEXT(\"CreateFile\")); 

// Write to the pipe that is the standard input for a child process. 
// Data is written to the pipe\'s buffers,so it is not necessary to wait
// until the child process is running before writing data.

   WriteToPipe(); 
   printf( \"\\n->Contents of %s written to child STDIN pipe.\\n\",argv[1]);

// Read from pipe that is the standard output for child process. 

   printf( \"\\n->Contents of child process STDOUT:\\n\\n\",argv[1]);
   ReadFromPipe(); 

   printf(\"\\n->End of parent execution.\\n\");

// The remaining open handles are cleaned up when this process terminates. 
// To avoid resource leaks in a larger application,close handles explicitly. 

   return 0; 
} 

void CreateChildProcess()
// Create a child process that uses the previously created pipes for STDIN and STDOUT.
{ 
   TCHAR szCmdline[]=TEXT(\"child\");
   PROCESS_INFORMATION piProcInfo; 
   STARTUPINFO siStartInfo;
   BOOL bSuccess = FALSE; 

// Set up members of the PROCESS_INFORMATION structure. 

   ZeroMemory( &piProcInfo,sizeof(PROCESS_INFORMATION) );

// Set up members of the STARTUPINFO structure. 
// This structure specifies the STDIN and STDOUT handles for redirection.

   ZeroMemory( &siStartInfo,sizeof(STARTUPINFO) );
   siStartInfo.cb = sizeof(STARTUPINFO); 
   siStartInfo.hStdError = g_hChildStd_OUT_Wr;
   siStartInfo.hStdOutput = g_hChildStd_OUT_Wr;
   siStartInfo.hStdInput = g_hChildStd_IN_Rd;
   siStartInfo.dwFlags |= STARTF_USESTDHANDLES;

// Create the child process. 

   bSuccess = CreateProcess(NULL,szCmdline,// command line 
      NULL,// process security attributes 
      NULL,// primary thread security attributes 
      TRUE,// handles are inherited 
      0,// creation flags 
      NULL,// use parent\'s environment 
      NULL,// use parent\'s current directory 
      &siStartInfo,// STARTUPINFO pointer 
      &piProcInfo);  // receives PROCESS_INFORMATION 

   // If an error occurs,exit the application. 
   if ( ! bSuccess ) 
      ErrorExit(TEXT(\"CreateProcess\"));
   else 
   {
      // Close handles to the child process and its primary thread.
      // Some applications might keep these handles to monitor the status
      // of the child process,for example. 

      CloseHandle(piProcInfo.hProcess);
      CloseHandle(piProcInfo.hThread);
   }
}

void WriteToPipe(void) 

// Read from a file and write its contents to the pipe for the child\'s STDIN.
// Stop when there is no more data. 
{ 
   DWORD dwRead,dwWritten; 
   CHAR chBuf[BUFSIZE];
   BOOL bSuccess = FALSE;

   for (;;) 
   { 
      bSuccess = ReadFile(g_hInputFile,chBuf,BUFSIZE,&dwRead,NULL);
      if ( ! bSuccess || dwRead == 0 ) break; 

      bSuccess = WriteFile(g_hChildStd_IN_Wr,dwRead,&dwWritten,NULL);
      if ( ! bSuccess ) break; 
   } 

// Close the pipe handle so the child process stops reading. 

   if ( ! CloseHandle(g_hChildStd_IN_Wr) ) 
      ErrorExit(TEXT(\"StdInWr CloseHandle\")); 
} 

void ReadFromPipe(void) 

// Read output from the child process\'s pipe for STDOUT
// and write to the parent process\'s pipe for STDOUT. 
// Stop when there is no more data. 
{ 
   DWORD dwRead,dwWritten; 
   CHAR chBuf[BUFSIZE]; 
   BOOL bSuccess = FALSE;
   HANDLE hParentStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

// Close the write end of the pipe before reading from the 
// read end of the pipe,to control child process execution.
// The pipe is assumed to have enough buffer space to hold the
// data the child process has already written to it.

   if (!CloseHandle(g_hChildStd_OUT_Wr)) 
      ErrorExit(TEXT(\"StdOutWr CloseHandle\")); 

   for (;;) 
   { 
      bSuccess = ReadFile( g_hChildStd_OUT_Rd,NULL);
      if( ! bSuccess || dwRead == 0 ) break; 

      bSuccess = WriteFile(hParentStdOut,NULL);
      if (! bSuccess ) break; 
   } 
} 

void ErrorExit(PTSTR lpszFunction) 

// Format a readable error message,display a message box,// and exit from the application.
{ 
    LPVOID lpMsgBuf;
    LPVOID lpDisplayBuf;
    DWORD dw = GetLastError(); 

    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER | 
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,dw,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR) &lpMsgBuf,NULL );

    lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT,(lstrlen((LPCTSTR)lpMsgBuf)+lstrlen((LPCTSTR)lpszFunction)+40)*sizeof(TCHAR)); 
    StringCchPrintf((LPTSTR)lpDisplayBuf,LocalSize(lpDisplayBuf) / sizeof(TCHAR),TEXT(\"%s failed with error %d: %s\"),lpszFunction,lpMsgBuf); 
    MessageBox(NULL,(LPCTSTR)lpDisplayBuf,TEXT(\"Error\"),MB_OK); 

    LocalFree(lpMsgBuf);
    LocalFree(lpDisplayBuf);
    ExitProcess(1);
}
    ,        您可以使用QProcess。它有2种方法:对于stdout为readAllStandardOutput,对于stderr为readAllStandardError。但是您不能使用startDetached。