![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
редирект вывода на экран [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