![](/img/trans.png)
[英]How to read output from cmd.exe using CreateProcess() and CreatePipe()
[英]cmd.exe created with CreateProcess() doesn't read from WriteFile()
我用 CreateProcess() 创建了一个子进程。 cmd.exe 的一个实例。 第一个命令在进程创建时传递,第二个命令在进程创建后通过 WriteFile() 传递。 第一份工作完成,第二份没有完成,我不知道为什么。 请帮忙
创建流程的代码是:
PROCESS_INFORMATION _info;
char cmd[1024];
strcpy(cmd,"C:\\Windows\\system32\\cmd.exe /k echo 1");
HANDLE _stdin_rd = NULL;
HANDLE _stdin_wr = NULL;
HANDLE _stdout_rd = NULL;
HANDLE _stdout_wr = NULL;
BOOL br;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;
br = CreatePipe(&_stdin_rd, &_stdin_wr, &sa, 0);
br = SetHandleInformation(_stdin_wr, HANDLE_FLAG_INHERIT, 0);
br = CreatePipe(&_stdout_rd, &_stdout_wr, &sa, 0);
br = SetHandleInformation(_stdout_rd, HANDLE_FLAG_INHERIT, 0);
STARTUPINFO si;
ZeroMemory(&si, sizeof(STARTUPINFO));
ZeroMemory(&_info, sizeof(PROCESS_INFORMATION));
si.cb = sizeof(STARTUPINFO);
si.dwFlags |= STARTF_USESTDHANDLES;
si.hStdInput = _stdin_rd;
si.hStdOutput = _stdout_wr;
si.hStdError = _stdout_wr;
br = CreateProcess(0, cmd,0,0,TRUE,CREATE_NO_WINDOW,0,0,&si,&_info);
CloseHandle(_stdout_wr);
CloseHandle(_stdin_rd);
CloseHandle(_info.hProcess);
CloseHandle(_info.hThread);
printf("process created...\n");
Sleep(320);
printf("waited\n\n");
与进程通信的代码是:
char bufy[10240];
char kom[1024];
long unsigned int prt, ovs=0;
for(int i=2;i<10;++i){
if(!ReadFile(_stdout_rd,bufy+ovs,10240-ovs,&prt,0)){
printf(" ERROR=%d\n",GetLastError());
break;
}
ovs+=prt;
printf("respond: ");
bufy[ovs]=0;
printf("%s\n",bufy);
sprintf(kom,"/k echo %d",i);
BOOL odgw = WriteFile(_stdin_wr,kom,strlen(kom),0,0);
printf("sent(%s): %s\n",odgw?"TRUE":"FALSE",kom);
}
return 0;
我得到的程序输出是:
process created...
waited
respond: 1
D:\>
sent(TRUE): /k echo 2
我发现了错误。 之后传递的命令不应以/k
开头,而应以\\n
结尾。 然后程序运行。 另外,在创建过程中, /k
之后可能没有任何内容,程序仍然可以运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.