powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ввод и вывод данных из консольного приложения
22 сообщений из 22, страница 1 из 1
ввод и вывод данных из консольного приложения
    #37131240
Ekklesiast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть прога которая должна (вроде как через CreateProcess) отпавить и получить данные в консольное приложение (путь - C:\Work\TestConsole.exe)
типа:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
 program  Project1;
 {$APPTYPE CONSOLE} 

 uses 
  SysUtils;

 begin 
   try 
    // Writeln('Hello !!!!!!!!!!!!!'); 

   x + y = z;

   except 
    on E: Exception  do 
      Writeln(E.ClassName, ': ', E.Message);
   end ;

 end .

т.е требуется передать x,y и получить на выходе z
плиз напишите пример кода ((((((((((((((
Заранее огромное спасибо!!!
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37131246
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
ReadLn(x);
ReadLn(y);
z := x+y;
WriteLn(z);

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37131251
Ekklesiast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Код: plaintext
1.
2.
3.
ReadLn(x);
ReadLn(y);
z := x+y;
WriteLn(z);


>есть прога которая должна (вроде как через CreateProcess)

через CreateProcess, а не в ручную ))))
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37131269
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[/quot Ekklesiast]через CreateProcess, а не в ручную ))))[/quot]
Пофиг, меняются только хэндлы:
Код: plaintext
1.
2.
3.
RunAndRedirectStdIo('c:\test.exe', pipe1, pipe2);
WriteLn(pipe1, x);
WriteLn(pipe1, y);
ReadLn(pipe2, z);

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37131665
Ekklesiast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov[/quot Ekklesiast]через CreateProcess, а не в ручную ))))
Пофиг, меняются только хэндлы:
Код: plaintext
1.
2.
3.
RunAndRedirectStdIo('c:\test.exe', pipe1, pipe2);
WriteLn(pipe1, x);
WriteLn(pipe1, y);
ReadLn(pipe2, z);
[/quot]

RunAndRedirectStdIo такого в яндаксе нету ))))
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37131675
Ekklesiast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
также мне надо получить консольный вывод, как я понимаю это может тока CreateProcess
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37131862
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ekklesiastтакже мне надо получить консольный вывод, как я понимаю это может тока CreateProcess

Ну да, он это может. В чём проблема-то?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37131937
Фотография Feg16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ekklesiast, скачай DelphiWorld там есть все ответы на любые твои вопросы в ближайший год :)
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37131944
Ekklesiast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Feg16Ekklesiast, скачай DelphiWorld там есть все ответы на любые твои вопросы в ближайший год :)
ага примеры на паскале 20 летней давности
и код на 2 страницы вместо 2-х нужных строчек мне
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37131952
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ekklesiastи код на 2 страницы вместо 2-х нужных строчек мне
В две строчки ты никак не уложишься. Открытие двух трубок это уже две строчки. Плюс одна
на CreateProcess, плюс много на чтение и запись. Отступись.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37131957
Фотография Feg16
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ekklesiastага примеры на паскале 20 летней давности
и код на 2 страницы вместо 2-х нужных строчек мнеГы, эво какой умный выискался... тогда WinExec('name >>asd.txt', sw_show) лови созданный файл Всего одна строчка. 30-ти летней давности правда, но тебя же это не остановит?
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37131973
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EkklesiastFeg16Ekklesiast, скачай DelphiWorld там есть все ответы на любые твои вопросы в ближайший год :)
ага примеры на паскале 20 летней давности
и код на 2 страницы вместо 2-х нужных строчек мне
Притом сомнительной ценности, как и последний совет, от автора, он путает перенаправление с трубами.
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37132399
Ekklesiast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
код консоли:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
 program  Project1;
 {$APPTYPE CONSOLE} 

 uses 
  SysUtils;

 var 
  x, y: integer;

 begin 
   try 
    x := StrToIntDef(paramstr( 1 ),  0 );
    y := StrToIntDef(paramstr( 2 ),  0 );
    WriteLn(x * y);
    Write('Press Enter....');
    ReadLn;
   except 
    on E: Exception  do 
      WriteLn(E.ClassName, ': ', E.Message);
   end ;

 end .

код вызова консоли с параметрами:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
 unit  Unit1;

 interface 

 uses 
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

 type 
  TForm1 =  class (TForm)
    Button1: TButton;
     procedure  Button1Click(Sender: TObject);
   private 
     { Private declarations } 
   public 
     { Public declarations } 
   end ;

 var 
  Form1: TForm1;

 implementation 

 {$R *.dfm} 

 // ****************************************************************************** 
 function  ExecAndWait( const  FileName, Params:  String ;  const  WinState: Word): boolean; export;
 var 
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine:  String ;
 begin 
   // Помещаем имя файла между кавычками, с соблюдением всех пробелов в именах Win9x 
  CmdLine := '"' + FileName + '" ' + Params;
  FillChar(StartInfo, SizeOf(StartInfo), # 0 );
   with  StartInfo  do 
   begin 
    cb := SizeOf(StartInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := WinState;
   end ;

   // CreateProcess 
  Result := CreateProcess( nil , PChar(CmdLine),  nil ,  nil , false, CREATE_NEW_CONSOLE  or  NORMAL_PRIORITY_CLASS,  nil ,  nil , StartInfo, ProcInfo);

   // Ожидаем завершения приложения 
   if  Result  then 
   begin 
    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
     // Free the Handles 
    CloseHandle(ProcInfo.hProcess);
    CloseHandle(ProcInfo.hThread);
   end ;
 end ;

 // ****************************************************************************** 
 procedure  TForm1.Button1Click(Sender: TObject);
 var 
  FileName, Params:  String ;
 begin 
  FileName := 'console.exe';
  Params := '30 20';
  ExecAndWait(FileName, Params, SW_SHOWNORMAL);
 end ;

 // ****************************************************************************** 
 end .


как получить теперь результат = 600 ???
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37132431
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ekklesiastкак получить теперь результат = 600 ???
Через трубу (pipe).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37132434
Ekklesiast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovEkklesiastкак получить теперь результат = 600 ???
Через трубу (pipe).


а толку? говорю же что примеры все старые ))

http://www.delphisources.ru/pages/faq/base/console_to_memo.html
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
 procedure  RunDosInMemo(CmdLine:  string ; AMemo: TMemo);
 const 
  ReadBuffer =  2400 ;
 var 
  Security: TSecurityAttributes;
  ReadPipe, WritePipe: THandle;
  start: TStartUpInfo;
  ProcessInfo: TProcessInformation;
  Buffer: Pchar;
  BytesRead: DWord;
  Apprunning: DWord;
 begin 
  Screen.Cursor := CrHourGlass;
  Form1.Button1.Enabled := False;
   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);
        AMemo.Text := AMemo.text +  string (Buffer);

        Application.ProcessMessages;
       until  (Apprunning <> WAIT_TIMEOUT);
     end ;
    FreeMem(Buffer);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ReadPipe);
    CloseHandle(WritePipe);
   end ;
  Screen.Cursor := CrDefault;
  Form1.Button1.Enabled := True;
 end ;

 procedure  TForm1.Button1Click(Sender: TObject);
 begin 
  Memo1.Clear;
  RunDosInMemo('ping -t 192.168.28.200', Memo1);
 end ;

ошибка в

OemToAnsi(Buffer, Buffer);
[DCC Error] Unit1.pas(62): E2010 Incompatible types: 'Char' and 'AnsiChar'


правлю
Buffer: PChar;
на
Buffer: PAnsiChar;

ппц приложение не работает
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37132476
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ekklesiastппц приложение не работает
"Если приложение не работает, значит в нём баг." (с) мой.
"Есть время насаждать багов и есть время уничтожать багов." (с) почти твой.
"Ищите и обрящете" (с) хз чей.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37132496
Ekklesiast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovEkklesiastппц приложение не работает
"Если приложение не работает, значит в нём баг." (с) мой.
"Есть время насаждать багов и есть время уничтожать багов." (с) почти твой.
"Ищите и обрящете" (с) хз чей.


"Изыди сотона" (с) не мой.
"Если бы я (как и многие) знал как писать подобный код, то на форуме бы не тусовались" (с) мой.
"СубФорум <Delphi> и существует чтобы помогали чайникам" (с) мой.
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37132498
Фотография FlyD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov"Ищите и обрящете" (с) хз чей.
кхм, вообще то в оригинале звучит "ищите да обрящете" и это из Библии
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #37132522
Ekklesiast
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
решение найдено, как всегда не без помощи )))
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
 function  ExecAndWait( const  FileName, Params: ShortString;  const  WinState: Word;  const  Output: TStringList): boolean; export;
 var 
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  CmdLine: ShortString;
  hPipeOutputRead: THANDLE;
  hPipeOutputWrite: THANDLE;
  hPipeErrorsRead: THANDLE;
  hPipeErrorsWrite: THANDLE;
  sa: TSECURITYATTRIBUTES;
  Stream: TMemoryStream;
  bTest: boolean;
  szBuffer:  array  [ 0  ..  255 ]  of  AnsiChar;
  dwNumberOfBytesRead: DWORD;
 begin 
  sa.nLength := SizeOf(sa);
  sa.bInheritHandle := True;
  sa.lpSecurityDescriptor :=  nil ;
  CreatePipe(hPipeOutputRead, hPipeOutputWrite, @sa,  0 );
  CreatePipe(hPipeErrorsRead, hPipeErrorsWrite, @sa,  0 );

   // Помещаем имя файла между кавычками, с соблюдением всех пробелов в именах Win9x 
  CmdLine := '"' + FileName + '" ' + Params;
  FillChar(StartInfo, SizeOf(StartInfo), # 0 );
  ZeroMemory(@ProcInfo, SizeOf(ProcInfo));
   with  StartInfo  do 
   begin 
    cb := SizeOf(StartInfo);
    dwFlags := STARTF_USESHOWWINDOW  or  STARTF_USESTDHANDLES;
    wShowWindow := WinState;
    hStdInput :=  0 ;
    hStdOutput := hPipeOutputWrite;
    hStdError := hPipeErrorsWrite;
   end ;
  Result := CreateProcess( nil , PChar( String (CmdLine)),  nil ,  nil , True, CREATE_NEW_CONSOLE  or  NORMAL_PRIORITY_CLASS,  nil ,  nil , StartInfo, ProcInfo);
   // Ожидаем завершения приложения 
   if   not  Result  then 
   begin 
    CloseHandle(hPipeOutputRead);
    CloseHandle(hPipeOutputWrite);
    CloseHandle(hPipeErrorsRead);
    CloseHandle(hPipeErrorsWrite);
    Exit;
   end ;
  CloseHandle(hPipeOutputWrite);
  CloseHandle(hPipeErrorsWrite);

   // Read output pipe 
  Stream := TMemoryStream.Create;
   try 
     while  True  do 
     begin 
      bTest := ReadFile(hPipeOutputRead, szBuffer,  256 , dwNumberOfBytesRead,  nil );
       if   not  bTest  then 
        Break;
      Stream.Write(szBuffer, dwNumberOfBytesRead);
     end ;
    Stream.Position :=  0 ;
    Output.LoadFromStream(Stream);
   finally 
    Stream.Free;
   end ;

  WaitForSingleObject(ProcInfo.hProcess, INFINITE);
   // Free the Handles 
  CloseHandle(ProcInfo.hProcess);
  CloseHandle(ProcInfo.hThread);
  CloseHandle(hPipeOutputRead);
  CloseHandle(hPipeErrorsRead);
 end ;

 procedure  TForm1.Button1Click(Sender: TObject);
 var 
  FileName, Params: ShortString;
  lstOut: TStringList;
  i: Integer;
 begin 
  FileName := 'console.exe';
  Params := '10 20';
  lstOut := TStringList.Create;
   try 
    ExecAndWait(FileName, Params, SW_SHOWNORMAL, lstOut);
    Memo1.Lines.Clear;
     for  i :=  0   to  lstOut.Count -  1   do 
      Memo1.Lines.Add(lstOut[i]);
   finally 
    lstOut.Free;
   end ;
 end ;

...
Рейтинг: 0 / 0
Период между сообщениями больше года.
ввод и вывод данных из консольного приложения
    #39480916
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите пожалуйста, по последнему листингу программы...
...
Как сделать, что бы консоль при открытии и обработке НЕ МОРГАЛА?
...
Спасибо!
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #39480921
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BellicПодскажите пожалуйста, по последнему листингу программы...
...
Как сделать, что бы консоль при открытии и обработке НЕ МОРГАЛА?
...
Спасибо!

wShowWindow := SW_HIDE;
...
Рейтинг: 0 / 0
ввод и вывод данных из консольного приложения
    #39480924
Bellic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schi, огромное спасибо!!!
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ввод и вывод данных из консольного приложения
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]