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