Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 ввод и вывод данных из консольного приложения  [new]
Ekklesiast
Member

Откуда:
Сообщений: 317
есть прога которая должна (вроде как через CreateProcess) отпавить и получить данные в консольное приложение (путь - C:\Work\TestConsole.exe)
типа:

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
плиз напишите пример кода ((((((((((((((
Заранее огромное спасибо!!!
22 фев 11, 19:15    [10275852]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43513

ReadLn(x);
ReadLn(y);
z := x+y;
WriteLn(z);

Posted via ActualForum NNTP Server 1.4

22 фев 11, 19:20    [10275870]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Ekklesiast
Member

Откуда:
Сообщений: 317
Dimitry Sibiryakov
ReadLn(x);
ReadLn(y);
z := x+y;
WriteLn(z);


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

через CreateProcess, а не в ручную ))))
22 фев 11, 19:24    [10275883]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43513

[/quot Ekklesiast]через CreateProcess, а не в ручную ))))[/quot]
Пофиг, меняются только хэндлы:
RunAndRedirectStdIo('c:\test.exe', pipe1, pipe2);
WriteLn(pipe1, x);
WriteLn(pipe1, y);
ReadLn(pipe2, z);

Posted via ActualForum NNTP Server 1.4

22 фев 11, 19:46    [10275944]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Ekklesiast
Member

Откуда:
Сообщений: 317
Dimitry Sibiryakov
[/quot Ekklesiast]через CreateProcess, а не в ручную ))))

Пофиг, меняются только хэндлы:
RunAndRedirectStdIo('c:\test.exe', pipe1, pipe2);
WriteLn(pipe1, x);
WriteLn(pipe1, y);
ReadLn(pipe2, z);
[/quot]

RunAndRedirectStdIo такого в яндаксе нету ))))
23 фев 11, 07:28    [10277206]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Ekklesiast
Member

Откуда:
Сообщений: 317
также мне надо получить консольный вывод, как я понимаю это может тока CreateProcess
23 фев 11, 08:00    [10277221]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43513

Ekklesiast
также мне надо получить консольный вывод, как я понимаю это может тока CreateProcess

Ну да, он это может. В чём проблема-то?

Posted via ActualForum NNTP Server 1.4

23 фев 11, 11:30    [10277684]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Feg16
Member [заблокирован]

Откуда: دولة اسرا
Сообщений: 5414
Блог
Ekklesiast, скачай DelphiWorld там есть все ответы на любые твои вопросы в ближайший год :)
23 фев 11, 12:30    [10277943]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Ekklesiast
Member

Откуда:
Сообщений: 317
Feg16
Ekklesiast, скачай DelphiWorld там есть все ответы на любые твои вопросы в ближайший год :)

ага примеры на паскале 20 летней давности
и код на 2 страницы вместо 2-х нужных строчек мне
23 фев 11, 12:33    [10277963]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43513

Ekklesiast
и код на 2 страницы вместо 2-х нужных строчек мне

В две строчки ты никак не уложишься. Открытие двух трубок это уже две строчки. Плюс одна
на CreateProcess, плюс много на чтение и запись. Отступись.

Posted via ActualForum NNTP Server 1.4

23 фев 11, 12:37    [10277991]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Feg16
Member [заблокирован]

Откуда: دولة اسرا
Сообщений: 5414
Блог
Ekklesiast
ага примеры на паскале 20 летней давности
и код на 2 страницы вместо 2-х нужных строчек мне
Гы, эво какой умный выискался... тогда WinExec('name >>asd.txt', sw_show) лови созданный файл Всего одна строчка. 30-ти летней давности правда, но тебя же это не остановит?
23 фев 11, 12:43    [10278008]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Anatoly Podgoretsky
Member

Откуда:
Сообщений: 62928
Ekklesiast
Feg16
Ekklesiast, скачай DelphiWorld там есть все ответы на любые твои вопросы в ближайший год :)

ага примеры на паскале 20 летней давности
и код на 2 страницы вместо 2-х нужных строчек мне

Притом сомнительной ценности, как и последний совет, от автора, он путает перенаправление с трубами.
23 фев 11, 12:48    [10278040]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Ekklesiast
Member

Откуда:
Сообщений: 317
код консоли:

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.

код вызова консоли с параметрами:
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 ???
23 фев 11, 16:50    [10279075]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43513

Ekklesiast
как получить теперь результат = 600 ???

Через трубу (pipe).

Posted via ActualForum NNTP Server 1.4

23 фев 11, 17:26    [10279210]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Ekklesiast
Member

Откуда:
Сообщений: 317
Dimitry Sibiryakov
Ekklesiast
как получить теперь результат = 600 ???

Через трубу (pipe).


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

http://www.delphisources.ru/pages/faq/base/console_to_memo.html
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;

ппц приложение не работает
23 фев 11, 17:30    [10279223]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 43513

Ekklesiast
ппц приложение не работает

"Если приложение не работает, значит в нём баг." (с) мой.
"Есть время насаждать багов и есть время уничтожать багов." (с) почти твой.
"Ищите и обрящете" (с) хз чей.

Posted via ActualForum NNTP Server 1.4

23 фев 11, 18:04    [10279374]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Ekklesiast
Member

Откуда:
Сообщений: 317
Dimitry Sibiryakov
Ekklesiast
ппц приложение не работает

"Если приложение не работает, значит в нём баг." (с) мой.
"Есть время насаждать багов и есть время уничтожать багов." (с) почти твой.
"Ищите и обрящете" (с) хз чей.


"Изыди сотона" (с) не мой.
"Если бы я (как и многие) знал как писать подобный код, то на форуме бы не тусовались" (с) мой.
"СубФорум <Delphi> и существует чтобы помогали чайникам" (с) мой.
23 фев 11, 18:19    [10279452]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
FlyD
Member

Откуда: Москва
Сообщений: 3899
Dimitry Sibiryakov
"Ищите и обрящете" (с) хз чей.
кхм, вообще то в оригинале звучит "ищите да обрящете" и это из Библии
23 фев 11, 18:19    [10279456]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Ekklesiast
Member

Откуда:
Сообщений: 317
решение найдено, как всегда не без помощи )))
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;

23 фев 11, 18:49    [10279578]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: ввод и вывод данных из консольного приложения  [new]
Bellic
Member

Откуда:
Сообщений: 2
Подскажите пожалуйста, по последнему листингу программы...
...
Как сделать, что бы консоль при открытии и обработке НЕ МОРГАЛА?
...
Спасибо!
1 июл 17, 15:28    [20605358]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
schi
Member

Откуда: Москва
Сообщений: 2041
Bellic
Подскажите пожалуйста, по последнему листингу программы...
...
Как сделать, что бы консоль при открытии и обработке НЕ МОРГАЛА?
...
Спасибо!


wShowWindow := SW_HIDE;
1 июл 17, 15:45    [20605384]     Ответить | Цитировать Сообщить модератору
 Re: ввод и вывод данных из консольного приложения  [new]
Bellic
Member

Откуда:
Сообщений: 2
schi, огромное спасибо!!!
1 июл 17, 16:24    [20605413]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить