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

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

Результат работы консольного приложения


Новичоккк ©   (2006-02-12 13:02:00) 

Я вызываю программы таким образом:
WinExec(PChar('taskkill -f -im calc.exe >C:\res.txt'),SW_HIDE);
Почему-то поток не перенаправляется :(
Возможно ли без лишних заморочек получить результат работы программы, выводимый ею при запуске из cmd?


Desdechado   (2006-02-12 17:43:00) [1]

2 AP
в моей XP Home SP2 нет никаких taskkill.exe
где вы такое нашли?


Anatoly Podgoretsky   (2006-02-12 17:23:00) [2]

Desdechado ©   (12.02.06 15:47) [5]
В XP есть, куда выводит не знаю, это задача для автора.


Desdechado   (2006-02-12 16:39:00) [3]

ping выводит в стандартный поток вывода
а про свой taskkill узнал, куда он шпарит данные?


Новичоккк   (2006-02-12 16:30:00) [4]

Вот нашел код:

function RunDos(CmdLine: string):string;
const
 ReadBuffer = 2400;
var
 Security: TSecurityAttributes;
 ReadPipe, WritePipe: THandle;
 start: TStartUpInfo;
 ProcessInfo: TProcessInformation;
 Buffer: Pchar;
 BytesRead: DWord;
 Apprunning: DWord;
begin
 Result:='';
 with Security do
 begin
   nlength := SizeOf(TSecurityAttributes);
   binherithandle := true;
   lpsecuritydescriptor := nil;
 end;
 if Createpipe(ReadPipe, WritePipe, @Security, 0) then
 begin
   Buffer := AllocMem(ReadBuffer + 1);
   FillChar(Start, Sizeof(Start), #0);
   start.cb := SizeOf(start);
   start.hStdOutput := WritePipe;
   start.hStdInput := ReadPipe;
   start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
   start.wShowWindow := SW_HIDE;
   if CreateProcess(nil, PChar(CmdLine), @Security, @Security, true,
     NORMAL_PRIORITY_CLASS, nil, nil, start, ProcessInfo) then
   begin
     repeat
       Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 100);
        ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);
       Buffer[BytesRead] := #0;
       OemToAnsi(Buffer, Buffer);
       result:=result + string(Buffer);
       Application.ProcessMessages;
     until (Apprunning <> WAIT_TIMEOUT);
   end;
   FreeMem(Buffer);
   CloseHandle(ProcessInfo.hProcess);
   CloseHandle(ProcessInfo.hThread);
   CloseHandle(ReadPipe);
   CloseHandle(WritePipe);
 end;
 ShowMessage(result);
end;


Если как в примере выполнить
RunDos('ping 127.0.0.1');
то всё работает нормально.

Если же выполнить
taskkill -f -im guard.exe
то программа зависает на строке
ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);


Новичоккк   (2006-02-12 15:50:00) [5]

Поищу. А всё же это стандартная утилита.
Пуск -> Выполнить -> taskkill


Desdechado   (2006-02-12 15:47:00) [6]

1. что-то такого "стандартного в ХР" я не нашел
2. может, эта программа только на консоль умеет выводить, а не в стандартные потоки? может, у нее хоть коды возврата есть? найди на нее мануал и читай


Новичоккк   (2006-02-12 15:39:00) [7]

Не знаю... Стандартное приложение WinXP - TaskKill.
Запускаю command.com. Пишу "TaskKill > C:\1.txt", но вывод всё равно идет в консоль и файл не создаётся. А я хотел чтобы моя программа вызывала программу с перенаправлением потока, а потом уже читать результат из файла. Теперь вот не знаю как из программы получить результат работы taskkill.exe.


Anatoly Podgoretsky   (2006-02-12 15:13:00) [8]

Существует три стандартных канала ввода/вывода
1. STD_INPUT
2. STD_OUTPUT
3. STD_ERROR

В какой у тебя направляется, указаное перенаправление относится к STD_OUTPUT


Новичоккк   (2006-02-12 13:20:00) [9]

Хм. Почему-то раньше все работал именно так.
А дело в TaskKill, т.к. даже при перенаправлении в command.com - результат всё равно выводится в консоль и в файл поток не перенаправляется.
Возможно ли как-нибудь получить результат в данном случае? Или хотя бы узнать как сработала функция без получения текста... Вожет она какой-нибудь результат возвращает?


Anatoly Podgoretsky   (2006-02-12 13:15:00) [10]

Чтобы перенапралялось требуется перенаправлятель в лице коммандного процессора.


Наверх

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