Форум: "WinAPI";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];
ВнизКонсольное приложение Найти похожие ветки
← →
Alex870 (2002-08-19 23:01) [0]Уважаемые посетители форума!
У меня такая проблема: есть консольное приложение, ну скажем myprog.exe и у него есть ключи, если я его запускаю из командной строки, то пишу : C:\myprog.exe /a /b /c > c:\1.txt , т.е. запускаю его с ключами, а результаты хочу получить в 1.txt. Не подскажите ли как из моей программы реализовать оператор (утилиту) "> c:\1.txt". Я пробовал ShellExecute и WinExec, но они позволяют только передавать ключи, т.е. С:\myprog.exe /a /b /c и всё. Спасибо!
← →
fishca (2002-08-19 23:12) [1]Надо просто в программе открыть файл 1.txt и писать в него
Через функцию CreateFile(...) и WriteFile(...) описания смотри в Win32 Help.
← →
Alex870 (2002-08-19 23:25) [2]Очень интересное предложение по поводу CreateFile, но как мне получить хэндл консоли во время работы моего консольного приложения (оно занимает доли секунды) т.е. как я понимаю при переходе от WinExec к CreateFile приложение уже отработает и дескриптор изменится (если я ошибаюсь подскажи пожалуйста).
← →
Almaz (2002-08-20 01:53) [3]>Alex870 © (19.08.02 23:25)
Все проще. Самому ничего никуда писать не надо - это сделает за вас система. Для этого надо только подменить поток вывода программы на свой файл:
procedure TForm1.Button2Click(Sender: TObject);
var
SI: TStartupInfo;
PI: TProcessInformation;
OutFile: HFile;
Security: TSecurityAttributes;
begin
Security.nLength := sizeof(Security);
Security.lpSecurityDescriptor := nil;
Security.bInheritHandle := TRUE;
// Создаем файл
OutFile := CreateFile("C:\1.txt", GENERIC_WRITE, 0, @Security, CREATE_ALWAYS, 0, 0);
if OutFile <> INVALID_HANDLE_VALUE then
begin
FillChar(SI, SizeOf(SI), 0);
SI.cb := SizeOf(SI);
// Подменяем стандартный вывод
SI.hStdOutput := OutFile;
SI.hStdError := OutFile;
SI.dwFlags := STARTF_USESTDHANDLES;
// Запускаем программу
if CreateProcess(nil, "C:\myprog.exe /a /b /c", nil, nil, TRUE, CREATE_DEFAULT_ERROR_MODE, nil, nil, SI, PI) then
begin
CloseHandle(PI.hThread);
// Ждем ее завершения
WaitForSingleObject(PI.hProcess, INFINITE);
CloseHandle(PI.hProcess);
// Обрабатываем файл
// ...
//
end;
CloseHandle(OutFile);
end;
end;
Удачи.
← →
DiamondShark (2002-08-20 11:08) [4]Ничего не надо подменять.
Выводить стандартными write/writeln
← →
fishca (2002-08-20 12:58) [5]
> procedure TForm1.Button2Click(Sender: TObject);
> var
> SI: TStartupInfo;
> PI: TProcessInformation;
> OutFile: HFile;
> Security: TSecurityAttributes;
> begin
> Security.nLength := sizeof(Security);
> Security.lpSecurityDescriptor := nil;
> Security.bInheritHandle := TRUE;
> // Создаем файл
> OutFile := CreateFile("C:\1.txt", GENERIC_WRITE, 0, @Security,
> CREATE_ALWAYS, 0, 0);
> if OutFile <> INVALID_HANDLE_VALUE then
> begin
> FillChar(SI, SizeOf(SI), 0);
> SI.cb := SizeOf(SI);
> // Подменяем стандартный вывод
> SI.hStdOutput := OutFile;
> SI.hStdError := OutFile;
> SI.dwFlags := STARTF_USESTDHANDLES;
> // Запускаем программу
> if CreateProcess(nil, "C:\myprog.exe /a /b /c", nil,
> nil, TRUE, CREATE_DEFAULT_ERROR_MODE, nil, nil, SI, PI)
> then
> begin
> CloseHandle(PI.hThread);
> // Ждем ее завершения
> WaitForSingleObject(PI.hProcess, INFINITE);
> CloseHandle(PI.hProcess);
> // Обрабатываем файл
> // ...
> //
> end;
> CloseHandle(OutFile);
> end;
> end;
И это называется ничего не надо делать :)
← →
Almaz (2002-08-20 23:34) [6]
> fishca © (20.08.02 12:58)
> И это называется ничего не надо делать :)
Нет. Это называется ничего не надо самому писать в файл.
> DiamondShark © (20.08.02 11:08)
> Ничего не надо подменять.
> Выводить стандартными write/writeln
Поясните, что и куда вы собираетесь "выводить стандартными write/writeln" ?
Удачи.
← →
Ученик (2002-08-20 23:44) [7]>Almaz © (20.08.02 23:34)
Прав DiamondShark © (20.08.02 11:08)
program Project2;
{$APPTYPE CONSOLE}
uses
SysUtils;
begin
Writeln("Test")
end.
Project2.exe >myout.txt
{ myout.txt }
Test
← →
Ученик (2002-08-20 23:52) [8]>Almaz ©
Сорри, немного не то :)
← →
Ученик (2002-08-21 01:08) [9]>Alex870 © (19.08.02 23:01)
WinExec("command.com /c c:\myprog.exe /a /b /c > c:\1.txt", sw_hide)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.10.07;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c