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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение из консоли в окно, Проблема выпонения комманд 
:(
    Опции темы
dinamyc
Дата 3.5.2006, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вот код 

Код

const
  ReadBuffer = 2400;

var
  Command:array[1..1024] of Char;
  i:integer;
  CommandStr,Temp, AllBuffer:string;
  Security: TSecurityAttributes;
  ReadPipe, WritePipe: THandle;
  Start: TStartUpInfo;
  ProcessInfo: TProcessInformation;
  Buffer: PChar;
  MyBuffer:array[1..10000] of Char;
  BytesRead: DWord;
  Apprunning: DWord;

begin
recv(ClientSocket,Command,SizeOf(Command),0);
for i:=1 to 1024 do Temp:=Temp+Command[i];
CommandStr:=copy(Temp, 1, Pos('#', Temp)-1);
with Security do
  begin
    nlength := SizeOf(TSecurityAttributes);
    binherithandle := true;
    lpsecuritydescriptor := nil;
  end;
if CreatePipe(ReadPipe, WritePipe, @Security, 0) then
  begin
    Buffer := VirtualAlloc(nil, ReadBuffer+1, MEM_COMMIT ,PAGE_READWRITE );
    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('cmd /c'+CommandStr),@Security,@Security,true,NORMAL_PRIORITY_CLASS,nil,nil,Start,ProcessInfo) then  //çàïóñê ïðîöåññà
    begin
      repeat
        Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 300);
        ReadFile(ReadPipe, Buffer[0], ReadBuffer, BytesRead, nil);
        OemToAnsi(Buffer, Buffer);
        AllBuffer:=AllBuffer+Buffer;
      until (Apprunning=WAIT_OBJECT_0);
      for i:=1 to Length(AllBuffer) do Mybuffer[i]:=AllBuffer[i];
      send(ClientSocket,MyBuffer,SizeOf(MyBuffer),0);
    end;
    VirtualFree(Buffer,0,MEM_RELEASE );
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ReadPipe);
    CloseHandle(WritePipe);
  end;


Проблема в том что комманды выполняются но не все, например ren file.name file1.name и все зависание по полной(т.е. выполняются те которые что-то выводят[netstat,ping,dir...]). В чем проблема не подскажите!   
PM MAIL   Вверх
dinamyc
Дата 4.5.2006, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Может че то с ReadFile и каналом. Ну кто с етим работал подскажите. Или мож условие не правильное
Apprunning=WAIT_OBJECT_0. A? 
PM MAIL   Вверх
Rouse_
Дата 5.5.2006, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Проверять твой код не буду, лениво тест писать, но вот что скажу, ориентируясь на приведенные тобой симптомы болезни:
Если внимательно почитать справку то можно заметить что ReadFile вообщето немножко синхронная функция если ты не используешь пятый параметр. Что это означает - это означает, что пока ты не получишь данные, она тормозит вызвавший ее поток. 
Теперь взглянем откуда мы читаем? Читаем из трубы (PIPE) (не важно именованной или нет). 
В справке сказано буквально следующее:
Код

To read from the pipe, a process uses the read handle in a call to the ReadFile function. ReadFile returns when one of the following is true: a write operation completes on the write end of the pipe, the number of bytes requested has been read, or an error occurs.

Т.е. если ты хочешь считать с нее (к примеру) 12 гигабайт, она тебя не отпустит пока не передаст тебе нужный обьем или не произойдет ошибка.
Будем считать что первый пункт с окончанием записи у тебя выполняется.
В твоем примере ты запрашиваешь 2400. Соответственно вопрос. А кто такое кол-во байт туда положит? 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
dinamyc
Дата 5.5.2006, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А че же делать, если к примеру комманда assoc выводит туеву хучу байт, а ren ничего?
Вернее еси написать writeln(buffer); то команда ren выведет С:\Docume~\.....\  и вот ета строчка подряд выводится n раз пока не закроешь окно. Ведь заранее узнать сколько выведет команда низя. Я че то не догоняю. Ну ладно щас буду експериментировать. 
PM MAIL   Вверх
Rouse_
Дата 5.5.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



обрати внимание на PeekNamedPipe 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
dinamyc
Дата 6.5.2006, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Именно она мне и нужна спасибо 
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.1005 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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