Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-21008
KIR
2002-09-27 00:15
2002.10.07
Как вывести запрос на закрытие приложения?


3-20880
First_May
2002-09-16 13:57
2002.10.07
Oracle


1-20961
denick
2002-09-26 11:27
2002.10.07
Как написать условие?


14-21211
Mike B.
2002-09-09 11:12
2002.10.07
---|Ветка была без названия|---


3-20923
cherepovets
2002-09-17 16:45
2002.10.07
Глюки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский