CreateProcess + stdout и грабли (windows) [решено]

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

CreateProcess + stdout и грабли (windows) [решено]

Сообщение shraibikus » 20.07.2011 22:26:01

Беру нагло стыбженный код:
http://www.kansoftware.ru/?tid=887
и он работает, с одним НО:
localhost не находит при таком запуске. Если пишем 127.0.0.1, то все ок.

Если я это-же самое делаю "локально", т.е. сам, либо тупо запустив процесс открытым окном - то все в порядке, т.е. localhost никуда не потерялся.
А тут на выходе получаю:
При проверке связи не удалось обнаружить узел localhost. Проверьте имя узла и повторите попытку.


Как так и куда копать?
Или какие подводные камни в этом есть, если у меня в принципе нет намерения работать с ping'ами.
:roll:
Последний раз редактировалось shraibikus 26.07.2011 19:18:03, всего редактировалось 1 раз.
Аватара пользователя
shraibikus
новенький
 
Сообщения: 36
Зарегистрирован: 22.09.2009 16:22:42
Откуда: Столица деревень

Re: CreateProcess + stdout и грабли (windows)

Сообщение shraibikus » 23.07.2011 13:21:43

тактически прицельно ап
:roll:
Аватара пользователя
shraibikus
новенький
 
Сообщения: 36
Зарегистрирован: 22.09.2009 16:22:42
Откуда: Столица деревень

Re: CreateProcess + stdout и грабли (windows)

Сообщение hinst » 23.07.2011 14:02:56

я так и не понял, в каком случае у тебя работает, а в каком не работает :cry:
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: CreateProcess + stdout и грабли (windows)

Сообщение sign » 23.07.2011 14:13:48

Упс. Не туда запостил.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: CreateProcess + stdout и грабли (windows)

Сообщение shraibikus » 23.07.2011 16:54:17

hinst писал(а):я так и не понял, в каком случае у тебя работает, а в каком не работает :cry:

Ок. Сейчас попробую по полочкам.

Если мы запускаем как процесс CreateProcess команду:
Код: Выделить всё
ping localhost

То в ответе stdout отчетливо видим:
Код: Выделить всё
При проверке связи не удалось обнаружить узел localhost. Проверьте имя узла и повторите попытку.

Что смущает.
При этом, если с помощью того-же CreateProcess запустить:
Код: Выделить всё
ping 127.0.0.1

То все ок.

Если мы обычными средствами запускаем команду (пуск - Выполнить - cmd):
Код: Выделить всё
ping localhost

То тоже все ок.

Вот я и не могу понять, чего не хватает запущенному процессу в первом случае, что-бы резолвить вполне уникальный localhost. Ситуация с точки зрения системного администратора мистическая, вплоть до того, что заставила меня проверить компьютер на вирусы с live-cd. А так-же вплотную изучить систему при помощи AVZ. Но ничего не нашел.
Мало того, я специально попробовал запустить этот-же бинарник на другом ПК - результат такой-же. Теперь у меня возникает вопрос, что возможно, когда создаем процесс CreateProcess он (например) получает не все переменные окружения? Или тут проблема в другом. Под Delphi этот код не пробовал, нет под рукой...
Аватара пользователя
shraibikus
новенький
 
Сообщения: 36
Зарегистрирован: 22.09.2009 16:22:42
Откуда: Столица деревень

Re: CreateProcess + stdout и грабли (windows)

Сообщение hinst » 23.07.2011 17:08:23

а ты попробуй воспользоваться не тем кодом, который ты нашёл в интернете, а классом TProcess фрипаскальной библиотеки для этих целей. Может быть, он окажется уместнее в твоём приложении, раз уж оно на фрипаскале
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: CreateProcess + stdout и грабли (windows)

Сообщение shraibikus » 26.07.2011 19:17:07

hinst Спасибо!

Работает так (проект дефолтный, для теста. На форму кидаются нужные компоненты):

Код: Выделить всё
uses
{...}
Windows;

{...}
function AnsiFromOem(sIn: string): string;
var
   s: string;
begin
     s:=sIn;
     OemToAnsi(PChar(s),PChar(s));
     Result := s;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
   ts: TStringList;
begin
  ts := TStringList.Create;
  Process1.CommandLine := 'ping localhost';
  Process1.Options := Process1.Options + [poWaitOnExit, poUsePipes];
  Process1.Execute;
  ts.LoadFromStream(Process1.Output);
  Memo1.Lines.Text := Utf8Encode(AnsiFromOem(ts.Text));
  FreeAndNil(ts);
end;         


на выходе видим все ок:
Код: Выделить всё


Обмен пакетами с localhost [127.0.0.1] по 32 байт:



Ответ от 127.0.0.1: число байт=32 время<1мс TTL=128

Ответ от 127.0.0.1: число байт=32 время<1мс TTL=128

Ответ от 127.0.0.1: число байт=32 время<1мс TTL=128

Ответ от 127.0.0.1: число байт=32 время<1мс TTL=128



Статистика Ping для 127.0.0.1:

    Пакетов: отправлено = 4, получено = 4, потеряно = 0 (0% потерь),

Приблизительное время приема-передачи в мс:

    Минимальное = 0мсек, Максимальное = 0 мсек, Среднее = 0 мсек



Правда почему-то каждая строчка дублируется crlf (возможно из-за множественных преобразований кодировки). Но это не критично.

Старый пример в топку :)
Аватара пользователя
shraibikus
новенький
 
Сообщения: 36
Зарегистрирован: 22.09.2009 16:22:42
Откуда: Столица деревень


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

Рейтинг@Mail.ru