Конференция "WinAPI" » Не читает вывод из консоли [D7]
 
  • mamedovvms © (25.08.09 08:45) [0]
    nit Unit1;

    interface

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

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

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}
    procedure RunDosInMemo(DosApp:String;AMemo:TMemo) ;
    const
      ReadBuffer = 512;
    var
    l:boolean;

    Security : TSecurityAttributes;
    ReadPipe,WritePipe : THandle;
    start : TStartUpInfo;
    ProcessInfo : TProcessInformation;
    Buffer : Pchar;
    BytesRead : DWord;
    Apprunning : DWord;
    x : Integer;
    MyStr : String;
    begin

      x := 0;
      With Security do
      begin
       Security.nlength := SizeOf(TSecurityAttributes) ;
       Security.binherithandle := true;
       Security.lpsecuritydescriptor := nil;
      end;

      if Createpipe (ReadPipe, WritePipe,
                     @Security, 0) then
      begin
        Buffer := AllocMem(ReadBuffer + 1) ;
        FillChar(Start,Sizeof(Start),#0) ;
        start.cb := SizeOf(STARTUPINFO) ;
        start.hStdOutput := WritePipe;
        start.hStdInput := ReadPipe;
        start.dwFlags := STARTF_USESTDHANDLES ;
        start.wShowWindow := SW_SHOW;

        if CreateProcess(nil,
              PChar(DosApp),
              @Security,
              @Security,
              true,
              NORMAL_PRIORITY_CLASS,
              nil,
              nil,
              start,
              ProcessInfo)
        then
        begin
        CloseHandle(WritePipe) ;
            WaitForSingleObject(ProcessInfo.hProcess, INFINITE);

            BytesRead := 0;
            l:=ReadFile(start.hStdInput,Buffer[0],ReadBuffer,BytesRead,nil) ;

            ShowMessage(Buffer);
            Buffer[BytesRead]:= #0;
            OemToAnsi(Buffer,Buffer) ;

            AMemo.Lines.Add(MyStr);
            AMemo.Refresh;
            Application.ProcessMessages;

          FreeMem(Buffer) ;
          CloseHandle(ProcessInfo.hProcess) ;
          CloseHandle(ProcessInfo.hThread) ;
          CloseHandle(ReadPipe) ;

        end;

      end;

     end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      RunDosInMemo('c:\cons.exe',memo1) ;
    end;

    end.

    что сделано не так??? может кто знает???
    да к стати консольная программа cons.exe просто выводит на экран строку 12345678910, написана на pascal может я что то не понял и нельзя так делать????
  • MBo © (25.08.09 09:18) [1]
    можно модуль doscommand.pas взять тут:
    http://forum.chertenok.ru/viewtopic.php?p=51996
  • Сергей М. © (25.08.09 09:25) [2]

    > программа cons.exe .. написана на pascal

    Это не консольная программа Windows, это программа MSDOS
  • Leonid Troyanovsky © (25.08.09 09:26) [3]

    > mamedovvms ©   (25.08.09 08:45)  

    > написана на pascal может я что то не понял и нельзя так

    Не надо извращений - перепиши на дельфи.

    --
    Regards, LVT.
  • MBo © (25.08.09 09:42) [4]
    попробуй 'cmd /C c:\cons.exe'
  • mamedovvms © (25.08.09 09:49) [5]

    >
    > > программа cons.exe .. написана на pascal
    >
    > Это не консольная программа Windows, это программа MSDOS

    огромное спасибо, но я почему то думал что программа на pascal консольная, все теперь работает
  • mamedovvms © (25.08.09 09:50) [6]
    я взял программу написанную на С++ и у меня выводит результат, как мне надо
  • Leonid Troyanovsky © (25.08.09 09:50) [7]

    > MBo ©   (25.08.09 09:42) [4]

    Тогда уж command /c
    Но, скорее всего, ntvdm не завершится, если вывод был.
    Можно попробывать батник с завершающим @cls или в
    pif сделать "закрывать окно по завершению", кажись так.

    --
    Regards, LVT.
  • mamedovvms © (25.08.09 10:10) [8]
    да и вот что еще хотел спросить дабы не плодить темы, бывает так что для некоторых консольных программ прога зависает на некоторое время на строке
    l:=ReadFile(start.hStdInput,Buffer[0],ReadBuffer,BytesRead,nil) ;
    что можно сделать, я как понимаю это из за того что нечего считывать
    ну у меня же есть строка
    WaitForSingleObject(ProcessInfo.hProcess, 10); то есть как я понимаю выдерживается определенное время для выполнения программы, так вот собственно вопрос как сделать такое, или можно ли

    repeat

    WaitForSingleObject(ProcessInfo.hProcess, INFINITE);

    ReadFile(start.hStdInput,Buffer[0],ReadBuffer,BytesRead,nil) ;

    until(buffer<>'');
    но главное что бы не зависало на строке читки
  • mamedovvms © (25.08.09 10:14) [9]
    извините строка WaitForSingleObject(ProcessInfo.hProcess, INFINITE); должна быть такой WaitForSingleObject(ProcessInfo.hProcess, 10);
  • Сергей М. © (25.08.09 10:45) [10]

    > это из за того что нечего считывать
    > ну у меня же есть строка
    > WaitForSingleObject(ProcessInfo.hProcess


    А ты вообще понимаешь, что делает строка WaitForSingleObject ?
  • mamedovvms © (25.08.09 10:54) [11]
    ну как я понимаю это передача процесса дочерниму приложению либо пока не будет выполнено либо на определенное время
  • Сергей М. © (25.08.09 12:11) [12]
    Это - ожидание завершения порожденного процесса.
  • mamedovvms © (25.08.09 12:35) [13]
    ну я тоже самое и имел ввиду , то есть как я понимаю если процесс не закончен то идем дальше, но как можно то сделать что бы не зависало то на строке чтения???
  • Сергей М. © (25.08.09 12:57) [14]

    > если процесс не закончен то идем дальше


    Куда дальше-то ? Из пайпа читать ? А что, спрашивается, читать-то, если процесс не закончен ?
  • mamedovvms © (25.08.09 13:03) [15]
    ну а если у нас например печатается война и мир, что теперь пока вся не напечатается ничего не будет что ли? а так можно было бы считать уже хотябы пару страниц
  • Сергей М. © (25.08.09 13:14) [16]

    > ожно было бы считать уже хотябы пару страниц


    Можно и одну строку и даже одну букву читать.
    Но ты-то целый роман запросил:

    ReadBuffer = 512;

    Эти этот роман в 512 символов порожденный тобой процесс волен выводить столь долго, сколь ему вздумается.

    Либо запрашивай к чтению существенно меньший размер данных (так чтобы задержка ожидания их появления была минимально допустимой тобой) либо выноси все это ожидающе-читающее хозяйство в доп.тред.
  • mamedovvms © (25.08.09 13:21) [17]
    я пробывал вместо 512 ставить 8 но процесс быстрее не становиться , может надо еще  при создании пайпа поставить?
    Createpipe (ReadPipe, WritePipe, @Security, 0)
  • Сергей М. © (25.08.09 13:28) [18]
    А что собссно мешает дождаться завершения процесса и прочитать роман целиком ?
  • mamedovvms © (25.08.09 13:38) [19]
    ну а если вот мне хочется что бы выводилось по 100 знаков, ну вот хочется
 
Конференция "WinAPI" » Не читает вывод из консоли [D7]
Есть новые Нет новых   [134431   +15][b:0][p:0.002]