Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

редирект вывода на экран [D6, Win95/98, Win2k, WinXP]


VirginKiller ©   (2002-11-10 12:36:00) 

Есть консольное приложение, написанное не мной, которое мне нужно запустить и получить то, что оно вывело на экран. Например, перенаправить вывод в файл. Как это можно сделать?


MBo   (2002-11-12 16:42:00) [1]

>Андрей Сенченко
Отправил


Андрей Сенченко   (2002-11-12 16:32:00) [2]

>MBo © (12.11.02 16:19)

Конечно интересно. Сам второй месяц бьюсь над распаковкой DOS-овских SFX-архивов
ansen@km.ru
Спасибо


MBo   (2002-11-12 16:19:00) [3]

>Андрей Сенченко
У меня работает.
Могу выслать, если интересно.


Андрей Сенченко   (2002-11-12 16:11:00) [4]

MBo © (11.11.02 14:06)

Сколько раз уже насталкивался на этот Твой ответ ...
и именно ЭТА ссылка

master-brain.boom.ru
DosCommand

не работает


Lmatveev   (2002-11-12 12:41:00) [5]

Вот пример. Я думаю разберешься:


procedure Dos2Win(CmdLine:String; OutMemo:TStrings);
const BUFSIZE = 4000;
var SecAttr : TSecurityAttributes;
hReadPipe,
hWritePipe : THandle;
StartupInfo: TStartUpInfo;
ProcessInfo: TProcessInformation;
Buffer : Pchar;
WaitReason,
BytesRead : DWord;
begin

with SecAttr do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
// Creazione della pipe
if Createpipe (hReadPipe, hWritePipe, @SecAttr, 0) then
begin
Buffer := AllocMem(BUFSIZE + 1); // Allochiamo un buffer di dimensioni BUFSIZE+1
FillChar(StartupInfo, Sizeof(StartupInfo), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.hStdOutput := hWritePipe;

StartupInfo.hStdError := hWritePipe;

StartupInfo.hStdInput := hReadPipe;
StartupInfo.dwFlags := STARTF_USESTDHANDLES +
STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_SHOW;

if CreateProcess(nil,
PChar(CmdLine),
@SecAttr,
@SecAttr,
true,
NORMAL_PRIORITY_CLASS,
nil,
nil,
StartupInfo,
ProcessInfo) then
begin
// Attendiamo la fine dell"esecuzione del processo
repeat
WaitReason := WaitForSingleObject( ProcessInfo.hProcess, 5000);
Application.ProcessMessages;
until (WaitReason <> WAIT_TIMEOUT);
// Leggiamo la pipe
Repeat
BytesRead := 0;
// Leggiamo "BUFSIZE" bytes dalla pipe
ReadFile(hReadPipe, Buffer[0], BUFSIZE, BytesRead, nil);
// Convertiamo in una stringa "\0 terminated"
Buffer[BytesRead]:= #0;
// Convertiamo i caratteri da DOS ad ANSI
OemToAnsi(Buffer,Buffer);
// Scriviamo nell" "OutMemo" l"output ricevuto tramite pipe
OutMemo.Text := OutMemo.text + String(Buffer);
until (BytesRead < BUFSIZE);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
end;
end;


Alex44   (2002-11-11 19:32:00) [6]

A hStdOutput---ne dolzhen li eto byt" handle?


Yegor Derevenets   (2002-11-11 16:30:00) [7]

_STARTUPINFO.hStdOutput
Где-то уже в форуме был человек, который подобный образом мучал HA, чтобы узнать, что нах-ся в архиве. :-)
По идее выделяется область памяти побольше, пихается поинтер на нее в SI.hStdOutput, потом разбираешься с форматом, что тебе поприходило, выдираешь текст и радуешься жизни!

--
Вполне возможно, полностью навравший,
Я!


MBo   (2002-11-11 14:06:00) [8]

master-brain.boom.ru
DosCommand


Song   (2002-11-11 13:48:00) [9]

2snake1977 (11.11.02 10:04)
Плохо видимо искали.


Alex44   (2002-11-11 13:44:00) [10]

2 Opuhshii, Song

Thanx. Poprobuyu.


snake1977   (2002-11-11 10:04:00) [11]

нет такой процедуры в Delphi, во всяком случае я не нашел :((
ReadConsoleInput/ReadConsole/PeekConsoleInput
может кто нибудь поможет куском исходника ??


Song   (2002-11-11 09:00:00) [12]

CreatePipe()


Opuhshii   (2002-11-11 08:09:00) [13]

можно,.. см.ReadConsoleInput/ReadConsole/PeekConsoleInput


SottNick   (2002-11-11 07:39:00) [14]

можно, как уже сказали
proga.exe >output.txt
а текстовый файл перечитывать периодически

или писать свой WINOLDAP
:o)


Alex44   (2002-11-10 19:18:00) [15]

Ya prisoedinyayus" k voprosu: mozhno li eto sdelat" dinamicheski? Skazhem, programma rabotaet dolgo i ya hochu ee output videt" u sebya. Drugimi slovami, kak perekryt" stdout i stderr?


[NEW]Splinter   (2002-11-10 12:45:00) [16]

В коммандной строке пишешь:
console.exe >> vivod.txt, где console.exe - приложение, "написанное не тобой", а в vivod.txt получишь, то что енто приложение вывело на экран.


Ученик   (2002-11-10 12:44:00) [17]

На примере ipconfig

procedure TForm1.Button1Click(Sender: TObject);
var
pi : TProcessInformation;
si : TStartupInfo;
begin
FillChar(si, SizeOf(TStartupInfo), 0);
si.cb := SizeOf(TStartupInfo);
si.dwFlags := STARTF_USESHOWWINDOW;
si.wShowWindow := SW_HIDE;
if CreateProcess(NIL, "command.com /c ipconfig.exe >c:\ipconfig.txt",
NIL, NIL, False, 0, NIL, NIL, si, pi) then try
WaitForSingleObject(pi.hProcess, INFINITE)
finally
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess)
end;
ListBox1.Items.LoadFromFile("c:\ipconfig.txt")
end;


valnech   (2002-11-10 12:44:00) [18]

NotYoursProg.exe > c:\temp\1.txt


Наверх

Титульная страница Поиск, карта сайта Написать письмо