Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не читает вывод из консоли [D7]


Страницы:   1 2 3

mamedovvms ©   (2009-08-25 08:45:00) 

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 может я что то не понял и нельзя так делать????


mamedovvms   (2009-08-25 13:03:00) [41]

ну а если у нас например печатается война и мир, что теперь пока вся не напечатается ничего не будет что ли? а так можно было бы считать уже хотябы пару страниц


Сергей М.   (2009-08-25 12:57:00) [42]


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


Куда дальше-то ? Из пайпа читать ? А что, спрашивается, читать-то, если процесс не закончен ?


mamedovvms   (2009-08-25 12:35:00) [43]

ну я тоже самое и имел ввиду , то есть как я понимаю если процесс не закончен то идем дальше, но как можно то сделать что бы не зависало то на строке чтения???


Сергей М.   (2009-08-25 12:11:00) [44]

Это - ожидание завершения порожденного процесса.


mamedovvms   (2009-08-25 10:54:00) [45]

ну как я понимаю это передача процесса дочерниму приложению либо пока не будет выполнено либо на определенное время


Сергей М.   (2009-08-25 10:45:00) [46]


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


А ты вообще понимаешь, что делает строка WaitForSingleObject ?


mamedovvms   (2009-08-25 10:14:00) [47]

извините строка WaitForSingleObject(ProcessInfo.hProcess, INFINITE); должна быть такой WaitForSingleObject(ProcessInfo.hProcess, 10);


mamedovvms   (2009-08-25 10:10:00) [48]

да и вот что еще хотел спросить дабы не плодить темы, бывает так что для некоторых консольных программ прога зависает на некоторое время на строке
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<>'');
но главное что бы не зависало на строке читки


Leonid Troyanovsky   (2009-08-25 09:50:00) [49]


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

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

--
Regards, LVT.


mamedovvms   (2009-08-25 09:50:00) [50]

я взял программу написанную на С++ и у меня выводит результат, как мне надо


mamedovvms   (2009-08-25 09:49:00) [51]


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

огромное спасибо, но я почему то думал что программа на pascal консольная, все теперь работает


MBo   (2009-08-25 09:42:00) [52]

попробуй 'cmd /C c:\cons.exe'


Leonid Troyanovsky   (2009-08-25 09:26:00) [53]


> mamedovvms ©   (25.08.09 08:45)  

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

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

--
Regards, LVT.


Сергей М.   (2009-08-25 09:25:00) [54]


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

Это не консольная программа Windows, это программа MSDOS


MBo   (2009-08-25 09:18:00) [55]

можно модуль doscommand.pas взять тут:
http://forum.chertenok.ru/viewtopic.php?p=51996


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо