Форум: "WinAPI";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
ВнизЧтение из консоли в окно Найти похожие ветки
← →
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 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.045 c