CreateProcess из процесса, запущенного из файла `cmd` - PullRequest
2 голосов
/ 16 марта 2012

Я пытаюсь запустить процесс из другого процесса.Механизм, в котором это достигается, не подлежит изменению.И модуль запуска, и исходный процесс находятся в C:\dir.

Я запускаю свой модуль запуска из файла cmd.Сам файл cmd находится где-то еще, и для того, чтобы он нашел исполняемый файл средства запуска, я устанавливаю переменную PATH:

set PATH=C:\dir;%PATH%;
launcher.exe

Модуль запуска запускает дочерний процесс со следующимкод:

  STARTUPINFO startupInfo;
  startupInfo.cb               = sizeof (STARTUPINFO);
  startupInfo.lpReserved       = 0;
  startupInfo.lpDesktop        = NULL;
  startupInfo.lpTitle          = NULL;
  startupInfo.dwX              = 0;
  startupInfo.dwY              = 0;
  startupInfo.dwXSize          = 0;
  startupInfo.dwYSize          = 0;
  startupInfo.dwXCountChars    = 0;
  startupInfo.dwYCountChars    = 0;
  startupInfo.dwFillAttribute  = 0;
  startupInfo.dwFlags          = _showInForeground ? STARTF_USESHOWWINDOW : 0;
  startupInfo.wShowWindow      = _showInForeground ? 1 : 0;
  startupInfo.cbReserved2      = 0;
  startupInfo.lpReserved2      = 0;

  PROCESS_INFORMATION processInfo;

  BOOL retVal = CreateProcess("child.exe", "", NULL, NULL, FALSE, 
                    _showInForeground ? (CREATE_NEW_CONSOLE | CREATE_DEFAULT_ERROR_MODE) : CREATE_DEFAULT_ERROR_MODE,
                    NULL, NULL, &startupInfo,&processInfo);

Возвращает 0, а последняя ошибка - 2, то есть File not found.

Если это поможет, GetCurrentDirectory возвращает каталог, в котором находится cmd, а не C:\dir.Я предполагаю, что CreateProcess не может найти child.exe, потому что PATH не доступен для него.

Есть идеи, как заставить это работать?

РЕДАКТИРОВАТЬ: Некоторые хорошие комментарии с ответами (так как комментарии иногда пропускаются):

Предложение: установите statupInfo.lpDirectory в "c: \ dir"

Ответ: не могу.Я начинаю с cmd, потому что каталог может измениться.

Ответы [ 2 ]

6 голосов
/ 16 марта 2012

Согласно MSDN, CreateProcess фактически выполняет поиск PATH, но только если lpApplicationName равен NULL и исполняемый файл является первым токеном в lpCommandLine.
Другими словами это должно работать, если вы звоните CreateProcess(NULL, "child.exe", ...

Хотя я еще не пробовал, так что YMMV и т. Д.

0 голосов
/ 16 марта 2012

Процесс запуска может получить свой собственный путь, используя GetModuleFileName(), который он может использовать для создания полного пути ко 2-му исполняемому файлу.Нет необходимости изменять переменную среды Path или изменять рабочий каталог.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...