Oberon space

General Category => Общий раздел => Тема начата: DIzer от Март 27, 2012, 09:03:02 am

Название: Проблемы с CreateProcess
Отправлено: DIzer от Март 27, 2012, 09:03:02 am
Как то странно работает CreateProcess при попытке запустить консольное приложение (похоже я торможу)
не запускается с
lpCommandLine="exname < infile  > outfile"
но запускается с
lpCommandLine="cmd /c exname < infile  > outfile"
так же запускается
lpCommandLine="exname"
Кто нибудь может сказать, в чем причина..
Название: Re: Проблемы с CreateProcess
Отправлено: DIzer от Март 27, 2012, 09:07:29 am
то есть меня интересует следующий вопрос - может ли причиной быть консольный экзешник
Название: Re: Проблемы с CreateProcess
Отправлено: Berserker от Март 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
Название: Re: Проблемы с CreateProcess
Отправлено: Geniepro от Март 27, 2012, 02:06:29 pm
Как то странно работает CreateProcess при попытке запустить консольное приложение (похоже я торможу)
не запускается с
lpCommandLine="exname < infile  > outfile"
но запускается с
lpCommandLine="cmd /c exname < infile  > outfile"
так же запускается
lpCommandLine="exname"
Кто нибудь может сказать, в чем причина..
Думаю, проблема возникла из-за перенаправления ввода/вывода. При запуске эти операции, видимо, трактуются как аргументы программы, чем они вовсе не являются.
Во втором случае они являются частью аргументов для команды cmd, поэтому прокатывают...
Название: Re: Проблемы с CreateProcess
Отправлено: vlad от Март 27, 2012, 03:10:16 pm
то есть меня интересует следующий вопрос - может ли причиной быть консольный экзешник

Перенаправление ввода/вывода - функциональность cmd.exe. Если хочешь без него - организовывай это перенаправление сам, у CreateProcess есть соответствующие хэндлы stdin/stdout.
Название: Re: Проблемы с CreateProcess
Отправлено: DIzer от Март 27, 2012, 05:37:37 pm
Geniepro и Vlad -думаю вы правы...решение удовлетворяющее (cmd) было найдено.. но кому охота иметь бомбу замедленного действия, короче СПАСИБО (просто я изначально пренебрегал подготовкой в системных вещах...) ну а ответы на такого рода вопросы не сыщешь в описании функции CreateProcess и без разницы какова твоя степень владения английским  :( ...
Название: Re: Проблемы с CreateProcess
Отправлено: DIzer от Март 27, 2012, 05:45:14 pm
... Vlad , насчет трубок... особого смысла пока не вижу использовать эту технику но это, как говорится.. вопрос задачи (или ее восприятия)....
Название: Re: Проблемы с CreateProcess
Отправлено: DIzer от Март 27, 2012, 05:59:03 pm
2 Berserker Спасибо ... именно в таком духе я и действовал...но получилось, то что получилось  :)