Сборник часто задаваемых вопросов по программированию в среде Borland C++ Builder

           

Как получать данные, выводящиеся...



Вопрос: Как получать данные, выводящиеся программой, написанной под 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 ); } --------------------------------------------------------------------------------

Содержание раздела