#include <windows.h>
#include <iostream.h>
#include <string.h>
main()
{
STARTUPINFO si;
char *a=new char[1024*1024];
char buf[1024],bufin[1024];
DWORD ind,i2,i3,t;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
HANDLE cstdin, wstdin, rstdout, cstdout;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;
GetStartupInfoA(&si);
CreatePipe(&cstdin, &wstdin, &sa, 0);
CreatePipe(&rstdout, &cstdout, &sa, 0);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = FALSE;
si.hStdOutput = cstdout;
si.hStdError = cstdout;
si.hStdInput = cstdin;
CreateProcessA(0, "cmd", 0, 0, TRUE, CREATE_NEW_CONSOLE, 0,0,&si,&pi);
for(;;)
{
ReadFile(rstdout,buf,1024,&i2,0);
strcpy(a,buf);
cout<<a;
cin>>bufin;
WriteFile(wstdin,bufin,strlen(bufin),&i3,0);
}
}
Переадресация стандартного ввода вывода
Код:
Только фактически ничего невышло. Выводит только какой то каламбур состоящей из стандартного приветствия виндовой консоли и ни как не реагирует на вводимые команды :( Люди плиз подскажите что я делаю не так :confused:
Код:
#include <windows.h>
#include <iostream.h>
#include <string.h>
int main()
{
STARTUPINFO si;
//char *a=new char[1024*1024];
char buf[1024],bufin[1024];
DWORD i2,i3;//,ind,t;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
HANDLE cstdin, wstdin, rstdout, cstdout;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;
si.cb = sizeof(STARTUPINFO);
GetStartupInfoA(&si);
CreatePipe(&cstdin, &wstdin, &sa, 0);
CreatePipe(&rstdout, &cstdout, &sa, 0);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = FALSE;
si.hStdOutput = cstdout;
si.hStdError = cstdout;
si.hStdInput = cstdin;
CreateProcessA(0, "cmd", 0, 0, TRUE, CREATE_NEW_CONSOLE, 0,0,&si,&pi);//
for(;;)
{
BOOL read=TRUE;
while (read == TRUE) { // пока есть что считывать
memset(buf,0,1024); // Очищаем буфер
ReadFile(rstdout,buf,1024,&i2,0);
read = (i2 == 1024);
//strcpy(a,buf);
cout<<buf;//a;
}
cin.getline(bufin,1023);
strcat(bufin,"\n"); // добавляем перевод строки
WriteFile(wstdin,bufin,strlen(bufin),&i3,0);
if (strcmpi(bufin,"exit\n")==0)
break; // Выход по exit
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
#include <iostream.h>
#include <string.h>
int main()
{
STARTUPINFO si;
//char *a=new char[1024*1024];
char buf[1024],bufin[1024];
DWORD i2,i3;//,ind,t;
PROCESS_INFORMATION pi;
SECURITY_ATTRIBUTES sa;
HANDLE cstdin, wstdin, rstdout, cstdout;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;
si.cb = sizeof(STARTUPINFO);
GetStartupInfoA(&si);
CreatePipe(&cstdin, &wstdin, &sa, 0);
CreatePipe(&rstdout, &cstdout, &sa, 0);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = FALSE;
si.hStdOutput = cstdout;
si.hStdError = cstdout;
si.hStdInput = cstdin;
CreateProcessA(0, "cmd", 0, 0, TRUE, CREATE_NEW_CONSOLE, 0,0,&si,&pi);//
for(;;)
{
BOOL read=TRUE;
while (read == TRUE) { // пока есть что считывать
memset(buf,0,1024); // Очищаем буфер
ReadFile(rstdout,buf,1024,&i2,0);
read = (i2 == 1024);
//strcpy(a,buf);
cout<<buf;//a;
}
cin.getline(bufin,1023);
strcat(bufin,"\n"); // добавляем перевод строки
WriteFile(wstdin,bufin,strlen(bufin),&i3,0);
if (strcmpi(bufin,"exit\n")==0)
break; // Выход по exit
}
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}
Да действительно так работает :) Только я вот немогу понять почему пр вводе команды приходится два раза жать ввод :confused: Как то что оказалась в пайпе ввода ещё попутно оказывается в пайпе выхода ?