读书人

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

发布时间: 2013-08-21 10:42:06 作者: rapoo

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);
}

读书人网 >VC

热点推荐