Автор Тема: Проблемы с CreateProcess  (Прочитано 4736 раз)

DIzer

  • Гость
Проблемы с CreateProcess
« : Март 27, 2012, 09:03:02 am »
Как то странно работает CreateProcess при попытке запустить консольное приложение (похоже я торможу)
не запускается с
lpCommandLine="exname < infile  > outfile"
но запускается с
lpCommandLine="cmd /c exname < infile  > outfile"
так же запускается
lpCommandLine="exname"
Кто нибудь может сказать, в чем причина..

DIzer

  • Гость
Re: Проблемы с CreateProcess
« Ответ #1 : Март 27, 2012, 09:07:29 am »
то есть меня интересует следующий вопрос - может ли причиной быть консольный экзешник

Berserker

  • Sr. Member
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Проблемы с CreateProcess
« Ответ #2 : Март 27, 2012, 01:45:38 pm »
У меня следующая функция работает. Путь к файлу нужно передавать полный (пропустив через SysUtils.ExpandFileName).

Код: (delphi) [Выделить]
FUNCTION RunProcess (CONST ExeFilePath, ExeArgs, ExeCurrentDir: STRING; WaitEnd: BOOLEAN): BOOLEAN;
CONST
  DEFAULT_PROCESS_ATTRIBUTES  = NIL;
  DEFAULT_THREAD_ATTRIBUTES   = NIL;
  INHERIT_HANDLES             = TRUE;
  NO_CREATION_FLAGS           = 0;
  INHERIT_ENVIROMENT          = NIL;

VAR
  StartupInfo:  Windows.TStartupInfo;
  ProcessInfo:  Windows.TProcessInformation;
 
BEGIN
  FillChar(StartupInfo, SIZEOF(StartupInfo), #0);
  StartupInfo.cb  :=  SIZEOF(StartupInfo);
  RESULT          :=  Windows.CreateProcess
  (
    NIL,
    PCHAR('"' + ExeFilePath + '" ' + ExeArgs),
    DEFAULT_PROCESS_ATTRIBUTES,
    DEFAULT_THREAD_ATTRIBUTES,
    NOT INHERIT_HANDLES,
    NO_CREATION_FLAGS,
    INHERIT_ENVIROMENT,
    POINTER(ExeCurrentDir),
    StartupInfo,
    ProcessInfo
  );
  IF RESULT THEN BEGIN
    IF WaitEnd THEN BEGIN
      Windows.WaitForSingleObject(ProcessInfo.hProcess, Windows.INFINITE);
    END; // .IF
  END; // .IF
END; // .FUNCTION RunProcess

Geniepro

  • Hero Member
  • *****
  • Сообщений: 1955
  • Знайте- истина в том, что повторено трижды подряд!
    • Просмотр профиля
Re: Проблемы с CreateProcess
« Ответ #3 : Март 27, 2012, 02:06:29 pm »
Как то странно работает CreateProcess при попытке запустить консольное приложение (похоже я торможу)
не запускается с
lpCommandLine="exname < infile  > outfile"
но запускается с
lpCommandLine="cmd /c exname < infile  > outfile"
так же запускается
lpCommandLine="exname"
Кто нибудь может сказать, в чем причина..
Думаю, проблема возникла из-за перенаправления ввода/вывода. При запуске эти операции, видимо, трактуются как аргументы программы, чем они вовсе не являются.
Во втором случае они являются частью аргументов для команды cmd, поэтому прокатывают...
to iterate is human, to recurse, divine

Салат «рекурсия»: помидоры, огурцы, салат…

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Проблемы с CreateProcess
« Ответ #4 : Март 27, 2012, 03:10:16 pm »
то есть меня интересует следующий вопрос - может ли причиной быть консольный экзешник

Перенаправление ввода/вывода - функциональность cmd.exe. Если хочешь без него - организовывай это перенаправление сам, у CreateProcess есть соответствующие хэндлы stdin/stdout.

DIzer

  • Гость
Re: Проблемы с CreateProcess
« Ответ #5 : Март 27, 2012, 05:37:37 pm »
Geniepro и Vlad -думаю вы правы...решение удовлетворяющее (cmd) было найдено.. но кому охота иметь бомбу замедленного действия, короче СПАСИБО (просто я изначально пренебрегал подготовкой в системных вещах...) ну а ответы на такого рода вопросы не сыщешь в описании функции CreateProcess и без разницы какова твоя степень владения английским  :( ...

DIzer

  • Гость
Re: Проблемы с CreateProcess
« Ответ #6 : Март 27, 2012, 05:45:14 pm »
... Vlad , насчет трубок... особого смысла пока не вижу использовать эту технику но это, как говорится.. вопрос задачи (или ее восприятия)....

DIzer

  • Гость
Re: Проблемы с CreateProcess
« Ответ #7 : Март 27, 2012, 05:59:03 pm »
2 Berserker Спасибо ... именно в таком духе я и действовал...но получилось, то что получилось  :)