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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2012, 14:17   #1
Phantosmagor
Пользователь
 
Регистрация: 14.03.2012
Сообщений: 24
По умолчанию ReadPipe WritePipe и CMDLine

Добрый день, уважаемые форумчане. Понадобилось мне, через программу иметь возможность ввода команд в CMDLine и с помощью Pipe и подмены хендлов выводить это в Memo. Код известный, он ниже:

Код:
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.Button3.Enabled := true;
  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.Button2.Enabled := False;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  Memo2.Clear;
  RunDosInMemo('ping "'+Edit6.text+'"', Memo2);
  end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Memo2.Clear;
  RunDosInMemo('telnet "'+Edit6.text+'" "'+Edit7.text+'" ', Memo2);
Возникло 2 вопроса:
1) Как в случае Ping -t передавать команду остановки (^C)? перепробовал множество комбинаций , таких как /3, ^C, Control-C, Control+C, Ctrrl+C и пр, не помогло. Если же в

start.wShowWindow := SW_hide; поменять на start.wShowWindow := SW_show; и пока перехват идёт в memo нажать в консоли ^C - она прекращает работу...

2) Не выводится telnet . Никак! почему - понять не могу ( ни ошибки подключения, ни ответы SQL сервера).
Пробовал просто

RunDosInMemo('telnet localhost 3306 ', Memo2);

Ответа -ноль.

Если именно через винду запускать командную строку, и в ней вводить тоже самое, то всё работает...

Подскажите, где может быть ошибка?
Phantosmagor вне форума Ответить с цитированием
Старый 10.09.2012, 08:25   #2
Phantosmagor
Пользователь
 
Регистрация: 14.03.2012
Сообщений: 24
По умолчанию

*насчёт telnet - решил проблему используя Client socket.
По первому вопросу всё ещё не ясно. (пока используется просто ping , а не ping -t)
Phantosmagor вне форума Ответить с цитированием
Ответ


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