怎么在一个程序中调用另一个命令行程序,并重定向输入的有关问题。分太多,解决立即结贴
如何在一个程序中调用另一个命令行程序,并重定向输入的问题。分太多,解决立即结贴
现有一个命令行程序contest.exe,它读取标准输入,并将结果写入到一个文件中。
现在要实现在一个界面程序(wintest.exe)中调用contest.exe,并向它的标准输入发一些数据。
我根据MSDN文档,利用CreatePipe和CreateProcess来实现,但是结果老是不对,contest.exe没有接收到数据,非常郁闷。
请各位看看代码,帮忙改正!
下面是contest.exe的源代码,不能修改:
#include "stdafx.h "
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
char *command = NULL;
command=argv[1];
if( !strcmp( command, "stdin " ))
{
FILE *input,*output;
input=stdin;
if (input != NULL)
{
output=fopen(argv[2], "wb ");
char buf[1024];
int readRet=0;
while (!feof(input))
{
readRet = fread(buf, sizeof(char), 1024, input);
buf[readRet]= '\0 ';
fwrite(buf,sizeof(char),readRet,output);
printf( "%s ",buf);
}
fflush(output);
}
}
return 0;
}
以上代码编辑后,我在命令行下运行它,命令格式为:contest.exe std result.txt,可以得到正确结果:
下面是我写的另外一个程序中调用contest.exe的代码:
int ret;
SECURITY_ATTRIBUTES sa1,sa2;
sa1.nLength = sizeof(SECURITY_ATTRIBUTES);
sa1.lpSecurityDescriptor = NULL;
sa1.bInheritHandle = TRUE;
sa2.nLength = sizeof(SECURITY_ATTRIBUTES);
sa2.lpSecurityDescriptor = NULL;
sa2.bInheritHandle = TRUE;
HANDLE hReadPipe2,hWritePipe2,hReadPipe1,hWritePipe1;
CreatePipe( &hReadPipe1, &hWritePipe1, &sa1, 0 );
CreatePipe( &hReadPipe2, &hWritePipe2, &sa2, 0 );
STARTUPINFO si;
::ZeroMemory(&si,sizeof(si));
si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.hStdInput=hReadPipe2;
si.hStdOutput=si.hStdError=hWritePipe1;
si.cb=sizeof(si);
PROCESS_INFORMATION processInfo;
char cmdLine[] = "contest.exe stdin result.txt ";
ZeroMemory( &processInfo , sizeof(PROCESS_INFORMATION) );
ret=CreateProcess(NULL, cmdLine, NULL,NULL,1,0,NULL,NULL,&si,&processInfo);
if( !ret ) return;
char buff[]= "this is a test string. ";
DWORD bytesRead=1024;
ret = WriteFile( hWritePipe2, buff, bytesRead, &bytesRead, 0 );
if( !ret ) return;
CloseHandle( hWritePipe2 );
Sleep(1000);
TerminateProcess( processInfo.hProcess, 0 );
CloseHandle( hReadPipe1 );
CloseHandle( hReadPipe2 );
CloseHandle( hWritePipe1 );
------解决方案--------------------
参考
http://community.csdn.net/Expert/topic/5225/5225434.xml?temp=.570904
------解决方案--------------------
CreateProcess跟操作系统有点关系的,你是2000系统还是xp?
------解决方案--------------------
// 只做了STDIN的重定向, STDOUT的类似, child process中是用MessageBox将收到的字符串显示出来的, 读是用fread()
//
现有一个命令行程序contest.exe,它读取标准输入,并将结果写入到一个文件中。
现在要实现在一个界面程序(wintest.exe)中调用contest.exe,并向它的标准输入发一些数据。
我根据MSDN文档,利用CreatePipe和CreateProcess来实现,但是结果老是不对,contest.exe没有接收到数据,非常郁闷。
请各位看看代码,帮忙改正!
下面是contest.exe的源代码,不能修改:
#include "stdafx.h "
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
char *command = NULL;
command=argv[1];
if( !strcmp( command, "stdin " ))
{
FILE *input,*output;
input=stdin;
if (input != NULL)
{
output=fopen(argv[2], "wb ");
char buf[1024];
int readRet=0;
while (!feof(input))
{
readRet = fread(buf, sizeof(char), 1024, input);
buf[readRet]= '\0 ';
fwrite(buf,sizeof(char),readRet,output);
printf( "%s ",buf);
}
fflush(output);
}
}
return 0;
}
以上代码编辑后,我在命令行下运行它,命令格式为:contest.exe std result.txt,可以得到正确结果:
下面是我写的另外一个程序中调用contest.exe的代码:
int ret;
SECURITY_ATTRIBUTES sa1,sa2;
sa1.nLength = sizeof(SECURITY_ATTRIBUTES);
sa1.lpSecurityDescriptor = NULL;
sa1.bInheritHandle = TRUE;
sa2.nLength = sizeof(SECURITY_ATTRIBUTES);
sa2.lpSecurityDescriptor = NULL;
sa2.bInheritHandle = TRUE;
HANDLE hReadPipe2,hWritePipe2,hReadPipe1,hWritePipe1;
CreatePipe( &hReadPipe1, &hWritePipe1, &sa1, 0 );
CreatePipe( &hReadPipe2, &hWritePipe2, &sa2, 0 );
STARTUPINFO si;
::ZeroMemory(&si,sizeof(si));
si.dwFlags=STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.hStdInput=hReadPipe2;
si.hStdOutput=si.hStdError=hWritePipe1;
si.cb=sizeof(si);
PROCESS_INFORMATION processInfo;
char cmdLine[] = "contest.exe stdin result.txt ";
ZeroMemory( &processInfo , sizeof(PROCESS_INFORMATION) );
ret=CreateProcess(NULL, cmdLine, NULL,NULL,1,0,NULL,NULL,&si,&processInfo);
if( !ret ) return;
char buff[]= "this is a test string. ";
DWORD bytesRead=1024;
ret = WriteFile( hWritePipe2, buff, bytesRead, &bytesRead, 0 );
if( !ret ) return;
CloseHandle( hWritePipe2 );
Sleep(1000);
TerminateProcess( processInfo.hProcess, 0 );
CloseHandle( hReadPipe1 );
CloseHandle( hReadPipe2 );
CloseHandle( hWritePipe1 );
------解决方案--------------------
参考
http://community.csdn.net/Expert/topic/5225/5225434.xml?temp=.570904
------解决方案--------------------
CreateProcess跟操作系统有点关系的,你是2000系统还是xp?
------解决方案--------------------
// 只做了STDIN的重定向, STDOUT的类似, child process中是用MessageBox将收到的字符串显示出来的, 读是用fread()
//