Работа с hStdOutput и hStdInput сторонних консольных программ
Мне нужно запустить, наример, cmd.exe, но всю информацию, которая будет отображаться в консоли выводить на Memo. Потом у меня есть Edit на форме, и хочу, что бы по нажатию Button1 команда help, которая была вбита в Edit, передавалась в консоль. Но есть проблемы-сразу после старта консоли(командой CreateProcess), консоль закрывается, потом я жму на кнопку, получаю вывод с консоли. Ну и так как консоль была закрыта, то команда help из Edit не попала куда надо. Как сделать правильно такой, хм, "интерфейс" что ли для консоли?
Код программы
Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
const ReadBuffer = 10000;
SECURITY_ATTRIBUTES Security;
HANDLE ReadPipe, WritePipe;
STARTUPINFO start;
PROCESS_INFORMATION ProcessInfo;
char Buffer[ReadBuffer];
DWord BytesRead, Apprunning;
//========================
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
Memo1->Text="";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
Security.nLength=sizeof(SECURITY_ATTRIBUTES);
Security.bInheritHandle=TRUE;
Security.lpSecurityDescriptor=NULL;
CreatePipe(&ReadPipe,&WritePipe,&Security,0);
ZeroMemory( &start, sizeof(start) );
start.cb = sizeof(start);
start.hStdOutput = WritePipe;
start.hStdInput = ReadPipe;
start.dwFlags = STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
start.wShowWindow = SW_SHOW;
CreateProcess(NULL,"C:\\WINDOWS\\system32\\cmd.exe", &Security, &Security, true, NORMAL_PRIORITY_CLASS,NULL,NULL,&start, &ProcessInfo);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
do
{
Apprunning = WaitForSingleObject(ProcessInfo.hProcess, 100) ; // обязательно
ReadFile(ReadPipe, Buffer, ReadBuffer, &BytesRead, NULL);
Buffer[BytesRead]= 0;
OemToAnsi(Buffer, Buffer);
Memo1->Text = Memo1->Text + Buffer;
Application->ProcessMessages();
}
while (Apprunning== WAIT_TIMEOUT) ;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char IBuffer[5]="help";
WriteFile(WritePipe, IBuffer, 6, &BytesRead, NULL);
}
//---------------------------------------------------------------------------
|