Форум: "Основная";
Текущий архив: 2002.11.21;
Скачать: [xml.tar.bz2];
Внизредирект вывода на экран Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.009 c