Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.27;
Скачать: CL | DM;

Вниз

Чтение из консоли в окно   Найти похожие ветки 

 
Dinamyc   (2006-05-04 23:29) [0]

вот код

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,Process Info) 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...]). В чем проблема не подскажите!
Может че то с ReadFile и каналом. Ну кто с етим работал подскажите. Или мож условие не правильное
Apprunning=WAIT_OBJECT_0. A?


 
Сергей М. ©   (2006-05-05 08:26) [1]


> выполняются те которые что-то выводят


А где у тебя собственно консольный ввод используется (WriteFile(WritePipe, ..)) ?


 
Dinamyc   (2006-05-05 13:08) [2]

Команда CommandStr, она посылается cmd.exe при запуске процесса, а получается она функцией recv(ClientSocket,Command,SizeOf(Command),0), которая ждет прихода данных на определенный порт.


 
Сергей М. ©   (2006-05-05 14:08) [3]


> Dinamyc   (05.05.06 13:08) [2]


А с чего ты взял. что строка CommandStr была принята полностью ?

Какого вообще хрена ты не анализируегшь результат вызова ф-ции recv() ? Это что, мода такая новая, да ?


 
Slym ©   (2006-05-05 16:21) [4]

Поставь какойнить TelnetServer и не парься


 
Slym ©   (2006-05-05 16:31) [5]

Dinamyc   (04.05.06 23:29)
for i:=1 to 1024 do Temp:=Temp+Command[i];

с таким кодом далеко не уйдешь :(

Dinamyc   (04.05.06 23:29)
CreatePipe(ReadPipe, WritePipe, @Security, 0) then

Вообщето 2 пайпа делать надо... а то получается сам в себя

Откуда код сдернул?


 
Dinamyc   (2006-05-06 02:32) [6]

2 ой пайп мне не нужен мне надо только считать данные и все. Цикл я создаю потому что Recv не работает со строками, а только с char и array of char. А проверка на данном этапе мне пока не нужна, но это я думаю не составит особого труда, вопрос не в том. Telnet Serv мне не нужен, нужно только API. А вобщем я сам разобрался, помогла ф-ция PeekNamedPipe.


 
Сергей М. ©   (2006-05-06 16:52) [7]


> Recv не работает со строками


Чавой-то ?

С этого места поподробней, пожалуйста ...


 
Eraser ©   (2006-05-06 18:53) [8]


> Dinamyc   (04.05.06 23:29)

вот пример глянь http://www.torry.ru/authorsmore.php?id=3914


 
Dinamyc   (2006-05-07 18:50) [9]

Ну не знаю но ни send ни recv со строками у меня(?) не работают. Вот! Так уж получилось что выдает токо глюки.(Перекодировки не помогают).Вот так, не знаю правда как у вас? А пример хорошенький спасибо.



Страницы: 1 вся ветка

Текущий архив: 2006.08.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.047 c
2-1154874742
K_Lock
2006-08-06 18:32
2006.08.27
StringGrid to BLOB


3-1150808801
boojum
2006-06-20 17:06
2006.08.27
Глюки со шрифтом в RaveReports


2-1155140817
Yusuf
2006-08-09 20:26
2006.08.27
glFrustum


3-1147426811
Juice
2006-05-12 13:40
2006.08.27
TClientDataSet: страноости с Eof


15-1154069603
Elen
2006-07-28 10:53
2006.08.27
Ошибка в SoftICE