Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Перенаправленный ввод-вывод


Страницы:   1 2

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-контролам  в контексте доп.потока НЕдопустимо.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо