首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VC >

DOS输出重定向有关问题。FC命令重定向失败

2013-08-21 
DOS输出重定向问题。FC命令重定向失败BOOL CDOSDlg::ExecDosCmd() {#define EXECDOSCMD dir c:SECURITY_A

DOS输出重定向问题。FC命令重定向失败
BOOL CDOSDlg::ExecDosCmd() 

{    

 #define EXECDOSCMD "dir c:" 

 SECURITY_ATTRIBUTES sa; 

 HANDLE hRead,hWrite;

 sa.nLength = sizeof(SECURITY_ATTRIBUTES); 

 sa.lpSecurityDescriptor = NULL; 

 sa.bInheritHandle = TRUE; 

 if (!CreatePipe(&hRead,&hWrite,&sa,0)) 

 { 

     return FALSE; 

 } 

 char command[1024];    

 strcpy(command,"Cmd.exe /C "); 

 strcat(command,EXECDOSCMD); 

 STARTUPINFO si; 

 PROCESS_INFORMATION pi; 

 si.cb = sizeof(STARTUPINFO); 

 GetStartupInfo(&si); 

 si.hStdError = hWrite;           

 si.hStdOutput = hWrite;          

 si.wShowWindow = SW_HIDE; 

 si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; 

 

 if (!CreateProcess(NULL, command,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) 

 { 

     CloseHandle(hWrite); 

     CloseHandle(hRead); 

     return FALSE; 

 } 

 CloseHandle(hWrite);

 char buffer[4096] = {0};          

 DWORD bytesRead; 

 while (true) 

 { 

     if (!ReadFile(hRead,buffer,4095,&bytesRead,NULL)) 

    break; 

     

     AfxMessageBox(buffer);   // 

 } 

 CloseHandle(hRead); 

 return TRUE; 

        }

------------------------

如果#define EXECDOSCMD "dir c:"  换成 "fc e:\\1.txt e:\\2.txt" 就在

     if (!ReadFile(hRead,buffer,4095,&bytesRead,NULL)) 

    break; 

程序就跳出了?

原因是为什么?为什么dir的输出就可以正常通过管道读取 而fc的输出就不行?

已经在CMD下测试过FC命令,CMD下正常显示结果



[解决办法]

#include "stdafx.h"
#include <windows.h> 
#include <tchar.h>
#include <stdio.h> 
 
#define BUFSIZE 4096 
 
HANDLE hChildStdinRd, hChildStdinWr,  
   hChildStdoutRd, hChildStdoutWr, 
   hInputFile, hStdout;
 
BOOL CreateChildProcess(VOID); 
VOID WriteToPipe(VOID); 
VOID ReadFromPipe(VOID); 
VOID ErrorExit(LPSTR); 
 
int _tmain(int argc, TCHAR *argv[]) 

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

 
   hStdout = GetStdHandle(STD_OUTPUT_HANDLE); 
 
 
   if (! CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0)) 
      ErrorExit("Stdout pipe creation failed\n"); 


   SetHandleInformation( hChildStdoutRd, HANDLE_FLAG_INHERIT, 0);

 
   if (! CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0)) 
      ErrorExit("Stdin pipe creation failed\n"); 

 
   SetHandleInformation( hChildStdinWr, HANDLE_FLAG_INHERIT, 0);
 
   
   fSuccess = CreateChildProcess();
   if (! fSuccess) 
      ErrorExit("Create process failed with"); 

   ReadFromPipe(); 
 
   return 0; 

 
BOOL CreateChildProcess() 

   TCHAR szCmdline[]=TEXT("fc.exe c:\\1.txt c:\\2.txt");
   PROCESS_INFORMATION piProcInfo; 


   STARTUPINFO siStartInfo;
   BOOL bFuncRetn = FALSE; 
 
// Set up members of the PROCESS_INFORMATION structure. 
 
   ZeroMemory( &piProcInfo, sizeof(PROCESS_INFORMATION) );
 
// Set up members of the STARTUPINFO structure. 
 
   ZeroMemory( &siStartInfo, sizeof(STARTUPINFO) );
   siStartInfo.cb = sizeof(STARTUPINFO); 
   siStartInfo.hStdError = hChildStdoutWr;
   siStartInfo.hStdOutput = hChildStdoutWr;
   siStartInfo.hStdInput = hChildStdinRd;
   siStartInfo.dwFlags 
[解决办法]
= STARTF_USESTDHANDLES;
 
// Create the child process. 
    
   bFuncRetn = 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 (bFuncRetn == 0) 
      ErrorExit("CreateProcess failed\n");
   else 
   {
      CloseHandle(piProcInfo.hProcess);
      CloseHandle(piProcInfo.hThread);
      return bFuncRetn;
   }
}
VOID ReadFromPipe(VOID) 

   DWORD dwRead, dwWritten; 


   CHAR chBuf[BUFSIZE]; 
   if (!CloseHandle(hChildStdoutWr)) 
      ErrorExit("Closing handle failed"); 
   for (;;) 
   { 
      if( !ReadFile( hChildStdoutRd, chBuf, BUFSIZE, &dwRead, 
         NULL) 
[解决办法]
 dwRead == 0) break; 
      if (! WriteFile(hStdout, chBuf, dwRead, &dwWritten, NULL)) 
         break; 
   } 
   int i=0;
   i++;

 
VOID ErrorExit (LPSTR lpszMessage) 

   fprintf(stderr, "%s\n", lpszMessage); 
   ExitProcess(0); 
}

热点排行