Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2015, 12:57   #1
firstoxe
Пользователь
 
Регистрация: 24.11.2011
Сообщений: 11
По умолчанию cmd realtime и pipe

Привет всем, кто может подсказать по коду:

Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
procedure RunDosInMemo(DosApp: String; AMemo: TMemo);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure tform1.RunDosInMemo(DosApp: String; AMemo: TMemo);
const
  ReadBuffer = 2400;
var
  Security: TSecurityAttributes;
  ReadPipe, WritePipe: THandle;
  start: TStartUpInfo;
  ProcessInfo: TProcessInformation;
  Buffer: PAnsichar;
  BytesRead: DWord;
  Apprunning: DWord;
  Fil: string;
begin
  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_SHOW;
    Fil := DosApp;
    //Fil := Fil + dd;
    if CreateProcess(pointer(fil), pchar(fil+' /c ping mail.ru && exit'), @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);
      Repeat
        BytesRead := 0;
        ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);
        Buffer[BytesRead] := #0;
        OemToAnsi(Buffer, Buffer);
        AMemo.Text := AMemo.Text + String(Buffer);
      until (BytesRead < ReadBuffer);
    end;
    FreeMem(Buffer);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ReadPipe);
    CloseHandle(WritePipe);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear;
  RunDosInMemo('c:\windows\system32\cmd.exe', Memo1);
end;

end.
Долго копался в сети, нашел примеры, проблемы и их решения (но не всех). Пишу на Rad studio xe8.
Проблема: после нажатия на кнопку, запускается cmd с командой ping на сайт, всё отлично вырисовывается, но после завершения работы cmd прога намертво виснит на этом участке кода:
Код:
        ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);
при за пуске с ключами /c и доп командой exit (она не спасает ситуацию)
если только с одним ключом /c без exit то, консоль закрывается и прога виснит

при запуске с ключом /k выдает такое после 4 пинга

Цитата:
Обмен пакетами с mail.ru [217.69.139.200] с 32 байтами данных:
Ответ от 217.69.139.200: число байт=32 время=2мс TTL=56
Ответ от 217.69.139.200: число байт=32 время=2мс TTL=56
Ответ от 217.69.139.200: число байт=32 время=1мс TTL=56
Ответ от 217.69.139.200:
C:\Users\1\Documents\Embarcadero\St udio\Projects\Win32\Debug>
C:\Users\1\Documents\Embarcadero\St udio\Projects\Win32\Debug>C:\User
и то что это не является внутренней или внешней программой или файлом
firstoxe вне форума Ответить с цитированием
Старый 15.07.2015, 14:39   #2
firstoxe
Пользователь
 
Регистрация: 24.11.2011
Сообщений: 11
По умолчанию

копался у буржуев и нашёл вот этот код:
Код:
 function GetDosOutput(CommandLine: string; Work: string = 'C:\'): string;
var
  SA: TSecurityAttributes;
  SI: TStartupInfo;
  PI: TProcessInformation;
  StdOutPipeRead, StdOutPipeWrite: THandle;
  WasOK: Boolean;
  Buffer: array[0..255] of AnsiChar;
  BytesRead: Cardinal;
  WorkDir: string;
  Handle: Boolean;
begin
  Result := '';
  with SA do begin
    nLength := SizeOf(SA);
    bInheritHandle := True;
    lpSecurityDescriptor := nil;
  end;
  CreatePipe(StdOutPipeRead, StdOutPipeWrite, @SA, 0);
  try
    with SI do
    begin
      FillChar(SI, SizeOf(SI), 0);
      cb := SizeOf(SI);
      dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
      wShowWindow := SW_Show;
      hStdInput := GetStdHandle(STD_INPUT_HANDLE); // don't redirect stdin
      hStdOutput := StdOutPipeWrite;
      hStdError := StdOutPipeWrite;
    end;
    WorkDir := Work;
    Handle := CreateProcess(nil, PChar('cmd.exe /C ' + CommandLine),
                            nil, nil, True, 0, nil,
                            PChar(WorkDir), SI, PI);
    CloseHandle(StdOutPipeWrite);
    if Handle then
      try
        repeat
          WasOK := ReadFile(StdOutPipeRead, Buffer, 255, BytesRead, nil);
          if BytesRead > 0 then
          begin
            Buffer[BytesRead] := #0;
            OemToAnsi(Buffer, (Buffer));
            Result := Result + Buffer;
            form1.memo1.text:=form1.memo1.text + string(Buffer);
          end;
        until not WasOK or (BytesRead = 0);
        WaitForSingleObject(PI.hProcess, INFINITE);
      finally
        CloseHandle(PI.hThread);
        CloseHandle(PI.hProcess);
      end;
  finally
    CloseHandle(StdOutPipeRead);
  end;
end;
чутка поправил под себя, работает замечательно, но как сделать его реал тайм? Не могу совместить эти 2 кода
firstoxe вне форума Ответить с цитированием
Старый 15.07.2015, 14:49   #3
firstoxe
Пользователь
 
Регистрация: 24.11.2011
Сообщений: 11
По умолчанию

нашёл решение у буржуев, больше не актуально
firstoxe вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C, linux pipe Vanta11a Помощь студентам 2 18.03.2015 07:45
pipe,конвеер[c] MariaD Помощь студентам 0 14.12.2014 21:27
pipe sukharef Общие вопросы C/C++ 4 21.06.2013 13:13
Realtime драйвер под Windows для ПАУК-4x x4axis Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 07.08.2012 09:40
Видео в режиме realtime Holly1444 Помощь студентам 2 23.08.2009 17:07