Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
ВнизРезультат работы консольного приложения Найти похожие ветки
← →
Новичоккк (2006-02-12 13:02) [0]Я вызываю программы таким образом:
WinExec(PChar("taskkill -f -im calc.exe >C:\res.txt"),SW_HIDE);
Почему-то поток не перенаправляется :(
Возможно ли без лишних заморочек получить результат работы программы, выводимый ею при запуске из cmd?
← →
Anatoly Podgoretsky © (2006-02-12 13:15) [1]Чтобы перенапралялось требуется перенаправлятель в лице коммандного процессора.
← →
Новичоккк (2006-02-12 13:20) [2]Хм. Почему-то раньше все работал именно так.
А дело в TaskKill, т.к. даже при перенаправлении в command.com - результат всё равно выводится в консоль и в файл поток не перенаправляется.
Возможно ли как-нибудь получить результат в данном случае? Или хотя бы узнать как сработала функция без получения текста... Вожет она какой-нибудь результат возвращает?
← →
Anatoly Podgoretsky © (2006-02-12 15:13) [3]Существует три стандартных канала ввода/вывода
1. STD_INPUT
2. STD_OUTPUT
3. STD_ERROR
В какой у тебя направляется, указаное перенаправление относится к STD_OUTPUT
← →
Новичоккк (2006-02-12 15:39) [4]Не знаю... Стандартное приложение WinXP - TaskKill.
Запускаю command.com. Пишу "TaskKill > C:\1.txt", но вывод всё равно идет в консоль и файл не создаётся. А я хотел чтобы моя программа вызывала программу с перенаправлением потока, а потом уже читать результат из файла. Теперь вот не знаю как из программы получить результат работы taskkill.exe.
← →
Desdechado © (2006-02-12 15:47) [5]1. что-то такого "стандартного в ХР" я не нашел
2. может, эта программа только на консоль умеет выводить, а не в стандартные потоки? может, у нее хоть коды возврата есть? найди на нее мануал и читай
← →
Новичоккк (2006-02-12 15:50) [6]Поищу. А всё же это стандартная утилита.
Пуск -> Выполнить -> taskkill
← →
Новичоккк (2006-02-12 16:30) [7]Вот нашел код:
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);
← →
Desdechado © (2006-02-12 16:39) [8]ping выводит в стандартный поток вывода
а про свой taskkill узнал, куда он шпарит данные?
← →
Anatoly Podgoretsky © (2006-02-12 17:23) [9]Desdechado © (12.02.06 15:47) [5]
В XP есть, куда выводит не знаю, это задача для автора.
← →
Desdechado © (2006-02-12 17:43) [10]2 AP
в моей XP Home SP2 нет никаких taskkill.exe
где вы такое нашли?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c