void __fastcall TForm1::Button1Click(TObject *Sender)
{
STARTUPINFO si;
char c;
unsigned long fs,rc;
TProcessInformation pi;
HANDLE tRead,cWrite;
unsigned long prh,exc;
TSecurityAttributes sa;
AnsiString result="";
ZeroMemory(&si,sizeof(si));
ZeroMemory(&pi,sizeof(pi));
si.cb=sizeof(si);
si.dwFlags=STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow=SW_HIDE;
sa.nLength=sizeof(sa);
sa.lpSecurityDescriptor=NULL;
sa.bInheritHandle=true;
CreatePipe(&tRead,&cWrite,&sa,2048 );
si.hStdInput=GetStdHandle(STD_INPUT_HANDLE);
si.hStdError=cWrite;
si.hStdOutput=cWrite;
if(!CreateProcess(NULL,Edit1->Text.c_str(),NULL,NULL,true,0,NULL,NULL,&si,&pi))
{
CloseHandle(tRead);
CloseHandle(cWrite);
ShowError();
}
else
{
prh=(unsigned long)pi.hProcess;
do
{
do
{
fs=GetFileSize(tRead,NULL);
if(fs!=0)ReadFile(tRead,&c,1,&rc,NULL);
result=result+c;
}
while(fs!=0);
Sleep(0);
}
while(WaitForSingleObject(&prh,500)!=WAIT_OBJECT_0);
GetExitCodeProcess(&prh,&exc);
CloseHandle(tRead);
CloseHandle(cWrite);
}
Memo1->Text=result;
}
Перехват вывода консольной программы
Неудачное решение: скачать исходник из инета.
Вот код, который должен работать. (В чем дело? Если у кого-то есть рабочий исходник - жду не дождусь.)
Код:
Итак. Решение я нашел. То что написано сверху - ошибка.=) Если кому интересно... Ну... вы знаете...=)