Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.07;
Скачать: CL | DM;

Вниз

Консольное приложение   Найти похожие ветки 

 
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 вся ветка

Текущий архив: 2002.10.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.023 c
14-21251
Soft
2002-09-12 10:26
2002.10.07
FTP в инете нашару


1-21093
dim-
2002-09-24 21:39
2002.10.07
String в Dll


1-21051
UnDISCOvery
2002-09-26 16:55
2002.10.07
Как мне создать форму во вторичном потоке ?


1-21131
Oleon
2002-09-24 15:56
2002.10.07
Привет! Где можно выставить DEFAULT_CHARSET, чтобы кирилица была.


1-21015
Voldemar
2002-09-27 04:19
2002.10.07
Как прочитать строку из MemoryStream?