Как использовать _spawnvpe() с пользовательским значением PATH?

Я задал соответствующий вопрос в (http://stackoverflow.com/questions/10969488/why-does-windows-spawn-process-sometimes-trigger-error-status-sxs-assembly-not-f), но я Я боюсь, что сложность вопроса запутает его, поэтому вот очень простая версия:

Вот пример вызова _spawnvpe с ручной передачей значения PATH.

Это не работает. Выдает ошибки и не запускает блокнот.

Изменение на _spawnv или отсутствие передачи значения PATH заставляет его работать. Однако в документации _putenv четко указано, что формат значения env — KEY=VALUE.

Как заставить это работать?

Будьте конкретны и предоставьте либо diff, либо полную копию приведенного ниже кода, включая исправление.

#include <stdio.h>
#include <windows.h>
#include <process.h>
#include <errno.h>

int main(int argc, char *argv[]) {

  char *path_value;
  char buffer[4000];
  const char *env[2];
  const char *args[1];
  char *command;
  int result;
  intptr_t procHandle;

  path_value = getenv("PATH");
  sprintf(buffer, "PATH=%s", path_value);
  env[0] = buffer;
  env[1] = NULL;

  args[0] = NULL;

  int offset = 0;
  while (env[offset] != NULL) {
    printf("env %d: %s\n", offset, env[offset]);
    ++offset;
  }

  offset = 0;
  while (args[offset] != NULL) {
    printf("arg %d: %s\n", offset, args[offset]);
    ++offset;
  }

  command = "C:\\windows\\system32\\notepad.exe";

  procHandle = _spawnvpe(_P_NOWAIT, command, args, NULL);
  if (procHandle == -1) {
    printf("Failed to invoke command: %s\n", strerror(errno));
    exit(1);
  }

  _cwait(&result, procHandle, 0);
  if (result != 0)
    printf("Command exited with error code %d\n", result);
}

person Doug    schedule 18.06.2012    source источник
comment
Обязательно используйте сборку отладки, она дает вам подтверждение этого кода. argv[0] не может быть NULL, он должен указывать на путь к exe.   -  person Hans Passant    schedule 18.06.2012
comment
Вы даже не используете env в вызове _spawnvpe, представленном здесь.   -  person Hristo Iliev    schedule 18.06.2012


Ответы (1)


У меня работает со следующим кодом (показаны только измененные строки):

...
const char *args[2];
...
args[0] = "notepad.exe";
args[1] = NULL;
...
procHandle = _spawnvpe(_P_NOWAIT, command, args, env);
...

Visual Studio 2010, Windows HPC Server 2008 R2.

Обратите внимание, что Windows ищет программы И динамических библиотек в PATH, в отличие от большинства систем Unix, которые имеют отдельные переменные для путей к исполняемому файлу и библиотеке.

person Hristo Iliev    schedule 18.06.2012
comment
^____^ ты меня очень порадовал. Спасибо! - person Doug; 19.06.2012