ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |

25.02.2007, 03:21
|
|
Участник форума
Регистрация: 10.01.2007
Сообщений: 140
Провел на форуме: 246020
Репутация:
105
|
|
Перехват вывода cmd
Собственно задача вроде бы простая, но не могу решить, есть run.bat, он выполняется, выводит какие то данные, задача в том что бы перехватить вывод в какую нить строку, plz на Delphi или хотя бы на C++.
|
|
|

25.02.2007, 12:57
|
|
Участник форума
Регистрация: 21.02.2006
Сообщений: 285
Провел на форуме: 1347867
Репутация:
408
|
|
Могу привести пример на перле
Код:
#!/usr/bin/perl
open(STDOUT,"> out.txt");
system("run.bat");
close(STDOUT);
Данный код весь вывод (а точнее весь STDOUT) отправит в файл out.txt
|
|
|

25.02.2007, 13:11
|
|
Banned
Регистрация: 10.10.2006
Сообщений: 596
Провел на форуме: 2132613
Репутация:
1365
|
|
Может поможет : http://www.firststeps.ru/msoffice/win/bats/r.php?13 ты там полистай.
|
|
|

25.02.2007, 13:15
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
LoFFi, это, конечно, хорошо, но пайпы рулят беспезды.
автор, смотри в сторону popen/pclose
|
|
|

25.02.2007, 14:13
|
|
Members of Antichat - Level 5
Регистрация: 04.01.2007
Сообщений: 176
Провел на форуме: 17964969
Репутация:
1362
|
|
Вот готовый пример реализации, рабочий и на Дельфи:
Код:
function Dos2Win(CmdLine:String):string;
const BUFSIZE = 2000;
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.hStdInput := hReadPipe;
StartupInfo.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := SW_HIDE;
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,100);
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
Result := Result + String(Buffer);
until (BytesRead < BUFSIZE);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(hReadPipe);
CloseHandle(hWritePipe);
end;
end;
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|