Конференция "WinAPI" » Не читает вывод из консоли [D7]
 
  • Сергей М. © (25.08.09 13:47) [20]
    Мало ли что тебе хочется)
    Чужой процесс волен выводить 3 символа целый час, а следующие 97 символов за десятую секунды.
    Хочешь получить свои 100 "все сразу", за один вызов ReadFile ? Придется ждать час с лишним ? Не хочешь при этом "висеть" ? Читай пайп в доп.потоке.
  • mamedovvms © (25.08.09 14:04) [21]
    да не понял ты меня, что ты хочешь сказать что просто чтение , когда есть что читать может длиться несколько минут???
  • Сергей М. © (25.08.09 14:15) [22]
    Хочешь сказать, что PeekNamedPipe сказал тебе, что имеются к чтению 100 байт, ты тут же вызвал ReadFile, заказав к чтению 100 байт - и ReadFile при  этом выполняется несколько минут ?
  • mamedovvms © (25.08.09 14:38) [23]
    да нет просто сразу как только программа запустилась уже есть что считывать но она почему то не читает, даже использование PeekNamedPipe почему то ничего не дает, не знаю что не так
  • mamedovvms © (25.08.09 14:52) [24]
    почему долго не считывает, а потом выдает целую кучу, что я опять не так сделал вроде уже все посмотрел что бы было как надо
  • mamedovvms © (26.08.09 07:01) [25]
    переделал вот так но почему то все равно мне выводит огромное количество  строк, хотя должно выводить как я понимаю только одну строку, что опять сделал не так уже мозг кипит , не могу понять
    unit 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) ;
    var
    l:boolean;
    dwAvail:Cardinal;
    Security : TSecurityAttributes;
    ReadPipe,WritePipe : THandle;
    start : TStartUpInfo;
    ProcessInfo : TProcessInformation;
    BytesRead : DWord;
    Apprunning : DWord;
    x : Integer;
    MyStr,s : 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
       ZeroMemory(@start, SizeOf(TStartupInfo)); ;
       start.cb := SizeOf(STARTUPINFO) ;
       start.hStdOutput := WritePipe;
       start.hStdInput := 0;
       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) ;
       repeat

           PeekNamedPipe(ReadPipe, nil, 0, nil, @dwAvail, nil);
           if dwAvail>0 then
            begin
             SetLength(S, dwAvail);

            ReadFile(ReadPipe,PChar(S)^, Length(S), BytesRead,nil);
             ShowMessage(s);
             Break;
            end;

       until(dwAvail>0);
         CloseHandle(ProcessInfo.hProcess) ;
         CloseHandle(ProcessInfo.hThread) ;
         CloseHandle(ReadPipe) ;

      {   TerminateProcess(pi.hProcess,NO_ERROR);}
       end;

     end;

    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
     RunDosInMemo('c:\1\mxi-7.1-eu.exe c:\1\client.ini',memo1) ;
    end;

    end.

  • Leonid Troyanovsky © (26.08.09 09:37) [26]

    > mamedovvms ©   (26.08.09 07:01) [25]

    > одну строку, что опять сделал не так уже мозг кипит , не
    > могу понять


    procedure RunDosInMemo(DosApp:String;AMemo:TMemo) ;
    var
    Security : TSecurityAttributes;
    ReadPipe,WritePipe : THandle;
    start : TStartUpInfo;
    ProcessInfo : TProcessInformation;
    BytesRead : DWord;
    s: String;
    buf : array [0..4095] of Char;
    begin

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

    if Createpipe (ReadPipe, WritePipe,
                   @Security, 0) then
    begin
      ZeroMemory(@start, SizeOf(TStartupInfo)); ;
      start.cb := SizeOf(STARTUPINFO) ;
      start.hStdOutput := WritePipe;
      start.hStdError := WritePipe;

      start.dwFlags := STARTF_USESTDHANDLES ;
      start.wShowWindow := SW_SHOW;

      if CreateProcess(nil,
            PChar(DosApp),
            nil,
            nil,
            true,
            NORMAL_PRIORITY_CLASS,
            nil,
            nil,
            start,
            ProcessInfo)
      then
      begin
      CloseHandle(WritePipe) ;
      CloseHandle(ProcessInfo.hThread) ;

      repeat

        if not ReadFile(ReadPipe, buf[0], SizeOf(buf), BytesRead,nil) then
          Break;
        SetString(s, buf, BytesRead);
        AMemo.SelText := s;
      until (BytesRead = 0) and
            (WaitForSingleObject(ProcessInfo.hProcess, 0) = WAIT_OBJECT_0);

        CloseHandle(ProcessInfo.hProcess) ;

        CloseHandle(ReadPipe) ;

      end;

    end;

    end;

    procedure TForm1.Button1Click(Sender: TObject);
    begin
     RunDOSinMemo('ping localhost', memo1);
    end;


    Но, во-ще, за такой код убивать надо, из рогатки.

    --
    Regards, LVT.
  • mamedovvms © (26.08.09 09:57) [27]
    ну попробывать то конечно можно но как бы не советовал это раз, а во вторых я думаю лучше бы подсказали что и как надо сделать
  • Leonid Troyanovsky © (26.08.09 10:09) [28]

    > mamedovvms ©   (26.08.09 09:57) [27]

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

    Примерно так:

    http://groups.google.com/group/fido7.ru.delphi/msg/b67d07fe0087e067

    Но, и там ошибок хватает.
    Главная, BeginThread instead CreateThread, ну и там по-мелочи еще.
    Но, за основу проще взять и подработать напильником.

    --
    Regards, LVT.
  • mamedovvms © (26.08.09 10:25) [29]
    ладно, а подскажи пожалуйста , вот у меня есть консольное приложение 1.exe
    это приложение считывает данные которые ему надо из файла 2.txt как при запуске 1.exe передать параметр 2.txt
  • Leonid Troyanovsky © (26.08.09 10:31) [30]

    > mamedovvms ©   (26.08.09 10:25) [29]

    > это приложение считывает данные которые ему надо из файла
    > 2.txt как при запуске 1.exe передать параметр 2.txt

    В двойных кавычках. see AnsiQuotedStr function.
    Параметры разделяются пробелом.

    --
    Regards, LVT.
  • mamedovvms © (26.08.09 10:35) [31]
    то есть где мне надо это приписать , если не сложно объясните поконкретнее
  • mamedovvms © (26.08.09 10:41) [32]
    то есть мне не понятно где в моем коде это надо прописать здесь
    if CreateProcess(nil,
           PChar(DosApp),
           nil,
           nil,
           true,
           NORMAL_PRIORITY_CLASS,
           nil,
           nil,
           start,
           ProcessInfo)


    или
    RunDOSinMemo('ping localhost', memo1);


    и как
    AnsiQuotedStr ("2.txt"); так%
  • Leonid Troyanovsky © (26.08.09 11:25) [33]

    > mamedovvms ©   (26.08.09 10:41) [32]

    > RunDOSinMemo('ping localhost', memo1);


    var
     s: String;

    s := Format('\"%s\" \"%s\"', [FullPathNameExeFile, FullPathNameParamFile]);
    RunDOSinMemo(s, memo1);


    --
    Regards, LVT.
  • mamedovvms © (26.08.09 11:35) [34]
    то есть должно получиться так ???
    procedure RunDosInMemo(DosApp:String;AMemo:TMemo) ;
    var
    Security : TSecurityAttributes;
    ReadPipe,WritePipe : THandle;
    start : TStartUpInfo;
    ProcessInfo : TProcessInformation;
    BytesRead : DWord;
    s: String;
    buf : array [0..4095] of Char;
    begin

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

    if Createpipe (ReadPipe, WritePipe,
                  @Security, 0) then
    begin
     ZeroMemory(@start, SizeOf(TStartupInfo)); ;
     start.cb := SizeOf(STARTUPINFO) ;
     start.hStdOutput := WritePipe;
     start.hStdError := WritePipe;

     start.dwFlags := STARTF_USESTDHANDLES ;
     start.wShowWindow := SW_SHOW;

     if CreateProcess(nil,
           PChar(DosApp),
           nil,
           nil,
           true,
           NORMAL_PRIORITY_CLASS,
           nil,
           nil,
           start,
           ProcessInfo)
     then
     begin
     CloseHandle(WritePipe) ;
     CloseHandle(ProcessInfo.hThread) ;

     repeat

       if not ReadFile(ReadPipe, buf[0], SizeOf(buf), BytesRead,nil) then
         Break;
       SetString(s, buf, BytesRead);
       AMemo.SelText := s;
     until (BytesRead = 0) and
           (WaitForSingleObject(ProcessInfo.hProcess, 0) = WAIT_OBJECT_0);

       CloseHandle(ProcessInfo.hProcess) ;

       CloseHandle(ReadPipe) ;

     end;

    end;

    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var s:string;
    begin

    s := Format('"1.exe" "2.txt"', [FullPathNameExeFile, FullPathNameParamFile]);
    RunDOSinMemo(s, memo1);
    end;
  • Leonid Troyanovsky © (26.08.09 11:46) [35]

    > mamedovvms ©   (26.08.09 11:35) [34]

    > s := Format('"1.exe" "2.txt"', [FullPathNameExeFile, FullPathNameParamFile]);

    Здесь самодеятельность не нужна, здесь требуется сосредоточится
    на именах файлов вместе с полными путями к ним.

    И не надо повторно постить RunDosInMemo, от нее нас тошнит.

    Гм.. я про напильник, а руки, небось к топору привыкли.

    --
    Regards, LVT.
  • mamedovvms © (26.08.09 12:08) [36]
    лучше не знать к чему привыкли мои руки, что так трудно ответить или просто или вы просто не падете так низко что бы нормально ответить что и где как создать ???? неужели так сложно, или просто ваш профессионализм не позволяет???
  • Сергей М. © (26.08.09 12:17) [37]

    > что так трудно ответить


    Что, так трудно заглянуть в справку к ф-ции Format() ?
    А заодно и к WaitForSingleObject ?
  • mamedovvms © (26.08.09 12:26) [38]
    не надо лишних комментариев, вы тоже не асы во всем
  • Сергей М. © (26.08.09 12:31) [39]

    > не надо лишних комментариев


    Не надо брать на слабо.
    Так что мешает ?
 
Конференция "WinAPI" » Не читает вывод из консоли [D7]
Есть новые Нет новых   [134431   +15][b:0][p:0.003]