![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Перенаправленный ввод-вывод
GanibalLector © (2006-01-17 02:36:00)Создаю сокет,перенаправляю ввод-вывод на cmd.exe. Захожу клиентом и юзаю cmd.exe из клиента. Так вот,проверяю сие творение на 2 компьютерах. На обном все Ок,а на втором cmd сразу закрывается. В чем может быть дело???
Открыват cmd.exe так :
sHandle := accept(FSocket, nil, nil);
if sHandle <> INVALID_SOCKET then
begin
ZeroMemory(@St, SizeOf(TStartupInfo));
St.cb := SizeOf(TStartupInfo);
St.wShowWindow := SW_SHOW;
St.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
St.hStdInput := sHandle;
St.hStdOutput := sHandle;
St.hStdError := sHandle;
CreateProcess(nil, 'cmd.exe', nil, nil, true, 0, nil, nil, St, Pr);
Лорд Байрон (2006-01-22 12:00:00) [1]В какой из инет магазинов лучше регистрироваться чтобы больше покупали и какие проги надо продавать.
Помогите плизззззззззз...
P.S.
Прога создающая стерео изображение годится?
GanibalLector (2006-01-20 19:54:00) [2]Да,фаеврол стоит.При тестах я его закрывал или делал Allow All.
Вирусов вроде нет ;) Неделю назад проверял Касперским.
Даже поставил все update-ты последние в надежде на счастье. Но увы :(
В общем,я свою проблему разрешил.Сделал так : при получении сервером от клиента определенной команды запускаю "cmd.exe /c тут_комманда" и перенаправляю ввод-вывод на файл или pipe.Жду завершения процесса,накапливаю все в буфере,а потом отвечаю клиенту этим буфером.Работает за исключением пары комманд(find и еще что-то). От Лукавого конечно,но работает ;)
А на работе,все работает и так(т.е. через перенаправление cmd на сокет).
Вот такие чудеса !
З.Ы. Спасибо! Персонально Digitman © (19.01.06 10:51) [11]. Принял на вооружение ;)
Digitman (2006-01-20 16:27:00) [3]
> или я не прав?
Не прав.
Закрытие хендла в дан.случае не означает уничтожение созданного объекта-процесса, теряется лишь доступ тек.процесса к этому объекту.
А даже если ты и был бы прав, то - вникни еще раз в [12] - автор утверждает, что строчка CloseHandle(Pr.hProcess) еще не выполнена (отладчик поймал брейкпойнт на ней и приостановил текущий процесс), а процессу cmd.exe уже приключился кирдык
umbra (2006-01-20 16:16:00) [4]
>
> if not (CreateProcess(nil, 'cmd.exe', nil, nil,
> True, 0, nil, nil, St, Pr)) then
> MessageDlg('Ошибка:'+SysErrorMessage(GetLastError),MtError,
> [MbOk],0); // ошибки не будет
> CloseHandle(Pr.hProcess);
> CloseHandle(Pr.hThread);
может,я чего-то недопонимаю, но по-моему в этом фрагменте написано, что если процесс успешно создан, то его надо сразу же закрыть. или я не прав?
Digitman (2006-01-20 15:29:00) [5]
> umbra © (20.01.06 15:18) [21]
> до тех пор пока я не разорвусь клиентом
до "разрыва" и дело не доходит.
Как утверждает автор, процесс-сервер, с которым успешно соединился процесс-клиент, средствами CreateProcess успешновыполнил запуск процесса cmd.exe и остановил свое выполнение на брейкпойнте на операторе, следующем СРАЗУ за CreateProcess. При этом, как опять же утверждает автор, процесс cmd.exe едва стартовав тут жеснимается с выполнения... В этот момент при такой ситуации состояние клиента серверу абсолютно безразлично - процесс сервера отладчик приостановил на брейкпойнте.
umbra (2006-01-20 15:18:00) [6]2 Digitman © (20.01.06 13:59) [20]
> GanibalLector © (18.01.06 13:33) [6]
> При коннекте клиентом на сервере запускается и "висит" cmd.
> exe до тех пор пока я не разорвусь клиентом.
>
Digitman (2006-01-20 13:59:00) [7]
> umbra © (20.01.06 13:47) [18]
Какой такой "клиент" ?
Клиентский Socket же активируется автором в совершенно другом процессе, и этот самый процесс как раз и должен сниматься файрволом с выполнения, но никак не cmd ...
umbra (2006-01-20 13:53:00) [8]и неплохо бы и серверу и клиенту вести подробный лог при работе.
umbra (2006-01-20 13:47:00) [9]мое предположение - cmd закрывается потому, что подсоединившийся клиент отрубается файерволом.
Digitman (2006-01-20 13:21:00) [10]вот если только cmd.exe заражен-загажен (лезет в сеть, едва стартовав) - тогда еще понятно ..
Digitman (2006-01-20 13:20:00) [11]
> похоже на супер-пупер файервол ХР СП2
с чего бы "супер-пупер файерволу" снимать cmd-процесс, если ему еще ни одна команда по каналу ввода не поступила ?
непонятно ..
umbra (2006-01-20 12:29:00) [12]похоже на супер-пупер файервол ХР СП2
GanibalLector (2006-01-20 09:59:00) [13]Нет,ничего не пишет
Digitman (2006-01-20 08:38:00) [14]
> Да,УЖЕ закрыта
при этом система что-то пишет в Application Events Log ? И/или другие логи ?
GanibalLector (2006-01-19 19:29:00) [15]2 Digitman © (19.01.06 10:51) [11]
>А хотя бы вот так
Спасибо.Понял.
>Если поставить и поймать брейкпойнт на CloseHandle(Pr.hProcess);
Да,УЖЕ закрыта.
Digitman (2006-01-19 10:51:00) [16]
> На самом деле должно быть так
Нет, не так.
А хотя бы вот так :
procedure MemoOutput(Value:String);
begin
SendMessage(хэндл_формы, WM_MYMESSAGE, WParam(PChar(Value)), 0);
end;
procedure TMyForm.MyMessageHandler(var Message: TMessage); //обработчик WM_MYMESSAGE
begin
Memo1.Lines.Add(String(PChar(Message.WParam)));
end;
Если поставить и поймать брейкпойнт на
CloseHandle(Pr.hProcess);
cmd-консоль и в этом случае закрывается ?
GanibalLector (2006-01-19 01:10:00) [17]И вот еще : http://headnet.net.ru/dir6/p1370.htmтоже не работает. Тут видать проблема не в коде,а в чем-то другом. :(
GanibalLector (2006-01-18 21:45:00) [18]2 Digitman © (18.01.06 16:14) [7]
>Обращаться к визуальным VCL-контролам в контексте доп.потока НЕдопустимо.
Я знаю. Сказал же в [6],что черновой вариант. На самом деле должно быть так :
var CS:TRTLCriticalSection;
procedure MemoOutput(Value:String);
begin
EnterCriticalSection(CS);
Form1.Memo1.Lines.Add(Value);
LeaveCriticalSection(CS);
end;
// вызов MemoOutput('Нить запущена');
initialization
InitializeCriticalSection(CS);
finalization
DeleteCriticalSection(CS);
Тоже и для переменной WrCons надо сделать.
Но только и это НЕ решает моей проблемы!!!
P.S. Вот даже земляк GuAV говорит,что все работает. А у меня чЁто никак :(
GanibalLector (2006-01-18 21:45:00) [19]2 Digitman © (18.01.06 16:14) [7]
>Обращаться к визуальным VCL-контролам в контексте доп.потока НЕдопустимо.
Я знаю. Сказал же в [6],что черновой вариант. На самом деле должно быть так :
var CS:TRTLCriticalSection;
procedure MemoOutput(Value:String);
begin
EnterCriticalSection(CS);
Form1.Memo1.Lines.Add(Value);
LeaveCriticalSection(CS);
end;
// вызов MemoOutput('Нить запущена');
initialization
InitializeCriticalSection(CS);
finalization
DeleteCriticalSection(CS);
Тоже и для переменной WrCons надо сделать.
Но только и это НЕ решает моей проблемы!!!
P.S. Вот даже земляк GuAV говорит,что все работает. А у меня чЁто никак :(
Digitman (2006-01-18 16:14:00) [20]Отложи на время свои "беды с неожиданным закрытием CMD", у тебя серьезные проблемы еще ДО этого.
Обращаться к визуальным VCL-контролам в контексте доп.потока НЕдопустимо.