Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблемы с Anonimys Pipes, Консольный ввод/ввод, Не получается коректно реализовать(((((( 
:(
    Опции темы
sergio393
Дата 20.8.2010, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 19.8.2010

Репутация: нет
Всего: нет



Здарвствуйте! У меня не коректно работает консольный ввод вывод, через анонимные пайпы.
Суть моей программы в том, что она делаейт консольный ввод и вывод CMD.EXE, перехватывая его через пайпы.

Вот исходный тексто

Код

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,Windows;
var
  SecurityAttributes: TSecurityAttributes;
  ProcessInfo: TProcessInformation;
  StartUpInfo: TStartupInfo;
  newstdin,newstdout,read_stdout,write_stdin: THandle;
  Buffer1,Buffer2:  array[0..1023] of Char;
  BytesRead,BytesAvail: Cardinal;
  BuffLen: Integer;
  WorkDir,Line: string;
begin
  SecurityAttributes.nLength:=SizeOf(TStartUpInfo);
  SecurityAttributes.bInheritHandle:=True;
  SecurityAttributes.lpSecurityDescriptor:=nil;
  CreatePipe(newstdin,write_stdin,@SecurityAttributes,0);
  CreatePipe(read_stdout,newstdout,@SecurityAttributes,0);
  ZeroMemory(@StartUpInfo,SizeOf(TStartUpInfo));
  StartUpInfo.cb:=SizeOf(TStartUpInfo);
  StartUpInfo.dwFlags:=STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
  StartUpInfo.hStdInput:=newstdin;
  StartUpInfo.hStdOutput:=newstdout;
  StartUpInfo.hStdError:=newstdout;
  CreateProcess('C:\Windows\System32\cmd.exe',nil,nil,nil,True,CREATE_NEW_CONSOLE,nil,nil,StartUpInfo,ProcessInfo);
  while True do
  begin
    PeekNamedPipe(read_stdout,@Buffer1,1023,@BytesRead,@BytesAvail,nil);
    if BytesRead <> 0 then
    begin
      ZeroMemory(@Buffer1,SizeOf(Buffer1));
      if BytesAvail > 1023 then
      begin
        while BytesRead >= 1023 do
        begin
          ReadFile(read_stdout,Buffer1,SizeOf(Buffer1),BytesRead,nil);
          Write(Buffer1);
          ZeroMemory(@Buffer1,SizeOf(Buffer1));
        end;
      end
      else
      begin
        ReadFile(read_stdout,Buffer1,1023,BytesRead,nil);
        Buffer1[BytesRead]:=#13;
        Buffer1[BytesRead+1]:=#10;
        Writeln(Buffer1);
      end;
    end;
  ZeroMemory(@Buffer2,SizeOf(Buffer2));
  Read(Buffer2);
  BuffLen:=lstrlen(Buffer2);
  Buffer2[BuffLen]:=#13;
  Buffer2[BuffLen+1]:=#10;
  BuffLen:=SizeOf(Buffer2);
  WriteFile(write_stdin,Buffer2,BuffLen,BytesRead,nil);
  end;
  CloseHandle(ProcessInfo.hThread);
  CloseHandle(ProcessInfo.hProcess);
  CloseHandle(newstdin);
  CloseHandle(newstdout);
  CloseHandle(read_stdout);
  CloseHandle(write_stdin);

end.



1. Первый раз программа выводит номально мою команду, а второй раз Read(Buffer2) не срабатывает, в отладчике он тупо проходит без запроса ввода и CMD.EXE вывел фразу "Продолжить?" (см. скриншот). Мне надо чтобы программа нормально выполняла команды Это первое.
2.  Когда я тестил в отладчике программу то сначало отбражалось 
Код

Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

C:\Documents and Settings\User>

 А потом был запрос на ВВОД.

Но когда я тестил программу вне отладчика, а просто её выполнил, то приветсвие командной строки не выводилось, а вывелось ничего и был запрос на ввод, а только после ввода уже вывелось 
Код

Microsoft Windows XP [Версия 5.1.2600]
(С) Корпорация Майкрософт, 1985-2001.

C:\Documents and Settings\User>


Это приветствие и выполненая команда с фразой "Продолжить?" Но больше не получалось ввести, т.е. Read(Buffer2) - не работал(((( Помогите плиз в чём причина??

И последнее, после каждого запуска моей программы остаються не завершённые процессы CMD.EXE хотя я в программе их завершал?? странно. но уже у меня около 10 процессов cmd.exe в диспетчере!


Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  asd.JPG 149,98 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0493 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.