Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.11.21;
Скачать: CL | DM;

Вниз

редирект вывода на экран   Найти похожие ветки 

 
VirginKiller ©   (2002-11-10 12:36) [0]

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


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

На примере 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) [2]

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


 
[NEW]Splinter ©   (2002-11-10 12:45) [3]

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


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

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?


 
SottNick ©   (2002-11-11 07:39) [5]

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

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


 
Opuhshii ©   (2002-11-11 08:09) [6]

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


 
Song ©   (2002-11-11 09:00) [7]

CreatePipe()


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

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


 
Alex44   (2002-11-11 13:44) [9]

2 Opuhshii, Song

Thanx. Poprobuyu.


 
Song ©   (2002-11-11 13:48) [10]

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


 
MBo ©   (2002-11-11 14:06) [11]

master-brain.boom.ru
DosCommand


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

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

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


 
Alex44   (2002-11-11 19:32) [13]

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


 
Lmatveev   (2002-11-12 12:41) [14]

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


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;


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

MBo © (11.11.02 14:06)

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

master-brain.boom.ru
DosCommand

не работает


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

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


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

>MBo © (12.11.02 16:19)

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


 
MBo ©   (2002-11-12 16:42) [18]

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



Страницы: 1 вся ветка

Текущий архив: 2002.11.21;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.024 c
1-69415
den_c
2002-11-11 10:09
2002.11.21
Как сохранить в bmp файле содержимое TImage


1-69369
ec
2002-11-08 20:29
2002.11.21
аналог TStringList


14-69540
Программист
2002-11-03 19:40
2002.11.21
Доменные имена


1-69445
BALU1111
2002-11-11 15:40
2002.11.21
TListVeiw


14-69501
romych
2002-10-22 12:51
2002.11.21
InDy