Вопрос: Как получать данные, выводящиеся программой, написанной под DOS?
У меня в программе происходит запуск досовской программы, которая все свои действия выводит в стандартный поток вывода.
Как сделать так чтобы моя программа могла получать эти данные.
Ответ :
вот реально работающий пример
code:
--------------------------------------------------------------------------------
void __fastcall TForm1::Button1Click( TObject *Sender )
{
String fScript = ExtractFilePath( ParamStr( 0 ) ) + "temp.sam";
Memo1->Lines->SaveToFile( fScript );
String filename = ExtractFilePath( ParamStr( 0 ) ) + "samx.exe";
String fArg = fScript;
SECURITY_ATTRIBUTES sa;
ZeroMemory( &sa, sizeof( sa ) );
sa.nLength = sizeof( sa );
sa.bInheritHandle = true;
HANDLE hRead, hWrite;
if ( !CreatePipe( &hRead, &hWrite, &sa, 0 ) )
{
ShowMessage( "Cannot create pipe" );
return ;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
memset( &si, 0, sizeof( si ) );
si.hStdOutput = hWrite;
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USECOUNTCHARS | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.dwXCountChars = si.dwYCountChars = 1;
filename += " temp.sam " + Edit1->Text;
CreateProcess(
NULL, // или любая другая программа
filename.c_str(),
NULL,
NULL,
TRUE,
0,
NULL,
NULL,
&si,
&pi );
CloseHandle( hWrite );
CloseHandle( pi.hThread );
CloseHandle( pi.hProcess );
String rez;
char temp[ 255 ];
DWORD dwBytesRead;
while ( 1 )
{
memset( temp, 0, 255 );
if ( !ReadFile( hRead, temp, 255, &dwBytesRead, NULL ) || !dwBytesRead )
break;
rez += temp;
}
// ShowMessage(rez);
Memo2->Lines->Add( rez );
}
--------------------------------------------------------------------------------
(c) 2003 Borland X Portal
|