Какими должны быть переменные среды COMSPEC и PATH, чтобы найти интерпретатор команд с помощью system ()? - PullRequest
1 голос
/ 17 февраля 2010

Являются ли переменные среды ОС (XP) такими же, которые используются в процессе, запущенном в Visual Studio .NET C ++?

Похоже, интерпретатор команд не найден:
При использовании NULL в качестве команды system () возвращает 0 , а с командой - ENOENT Command interpreter cannot be found.

В windows (System-> Environment Variables) COMSPEC содержит путь к cmd.exe
PATH нет.

Каким должен быть PATH?

Кроме этого, не уверен, почему он не может найти переводчика.

Любые предложения приветствуются. Спасибо.

  if( system("tail -500 log.txt") == -1)
  {
      //Error calling tail.exe on log 
      //errno is a system macro that expands int returning
      //the last error. strerror() converts the error to it's
      //corresponding error message. 
      printf("Error calling tail.exe with system(): %s",strerror( errno ));

  }

EDIT1
Шаг в system () argv[0] = _tgetenv(_T("COMSPEC")); возвращает неверный указатель. Поскольку это исполняемый файл cgi, COMPSEC неправильно установлен или унаследован от ОС.
Теперь я устанавливаю COMSPEC до запуска процесса и использую CreateProcess (), как в пример 2

Однако процесс создания все еще возвращает 0? Все ближе. Видите какие-либо проблемы с этим? Спасибо.

 if (! SetEnvironmentVariable("COMSPEC", "C:\\WINDOWS\\system32\\cmd.exe") )
 {
    printf("SetEnvironmentVariable failed (%d)\n", GetLastError());         
 }

 //r = system("dir c:\\");
 r = CreateProcess("dir.exe", NULL, NULL, NULL, TRUE, NULL, 
    NULL,     // inherit parent's environment 
    NULL, &si, &pi);

РЕДАКТИРОВАТЬ 2
SetEnvironmentVariable () не работает. Тем не менее, putenv делает.
_putenv( "COMSPEC=C:\\WINDOWS\\system32\\cmd.exe" ); // C4996
Не уверен, в чем разница ...?
Теперь, когда установлен этот env var, любой запрос к приложению cgi из браузера дает возможность сохранить cgi.exe вместо его выполнения. Не уверен, почему это изменилось в зависимости от этого env var?

Ответы [ 2 ]

3 голосов
/ 17 февраля 2010

Переменные среды наследуются при запуске процесса, включая вызов system(...). Если не происходит чего-то странного, обычно нужно запускать% windir% \ system32 \ cmd.exe, следует расширять переменную среды, если только вы не можете использовать API для получения каталога Windows ' GetWindowsDirectory ». Смотрите здесь пример из MSDN .

Редактировать: IIRC, переменная среды COMSPEC, если выполняется в командной строке

> echo %COMSPEC%
C:\WINDOWS\system32\cmd.exe

Вы получили неверный указатель, потому что он, вероятно, не настроен, приведенная выше команда echo должна доказать, что, если вы не получаете вывод, она не установлена, щелкните правой кнопкой мыши на «Мой компьютер», щелкните левой кнопкой мыши на «Свойства» », появится диалоговое окно с вкладками, нажмите« Дополнительно », найдите« Переменные среды »... см. два скриншота здесь ...

Также я должен указать, что вы устанавливаете переменную среды временно, поэтому она не увидит «COMSPEC» .... она не постоянна, единственный постоянный способ сделать это - следовать скриншотам ...

Я пытаюсь получить скриншоты на месте ....

альтернативный текст http://img706.imageshack.us/img706/9434/envvars.png

альтернативный текст http://img638.imageshack.us/img638/5743/comspec.png

Изменить # 2: Просто чтобы указать на это, когда вы устанавливаете здесь переменную окружения, это временно, а не постоянно!

if (! SetEnvironmentVariable("COMSPEC", "C:\\WINDOWS\\system32\\cmd.exe") )
 {
    printf("SetEnvironmentVariable failed (%d)\n", GetLastError());         
 }

 //r = system("dir c:\\");
 r = CreateProcess("dir.exe", NULL, NULL, NULL, TRUE, NULL, 
    NULL,     // inherit parent's environment 
    NULL, &si, &pi);

При использовании вызова CreateProcess обязательно произойдет сбой, посмотрите на комментарий «наследовать родительскую среду», что не может произойти, поскольку среда была настроена временно. Вы тестировали простую команду эха здесь. Что-то не так с тем, почему переменная COMSPEC не установлена ​​... после ее постоянной установки - вам нужно перезагрузить компьютер, чтобы он заработал. Затем приведенная выше команда echo должна показать значение для этой переменной среды, и, в свою очередь, это

argv[0] = strdup(_tgetenv(_T("COMSPEC")));

должен вернуть правильный указатель ... кстати, я думаю, что это должно быть strdup также ...

Редактировать # 3 : Ой, я заметил, когда я использовал '& pi', вместо этого он стал символом пи! ... э-э, сейчас это исправлено ... также я исправил это ' argv 'код здесь:

argv[0] = _tcsdup(_tgetenv(_T("COMSPEC")));

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

2 голосов
/ 17 февраля 2010

Пуск + Панель управления, Система, Дополнительно, Переменные среды. Выберите Путь в разделе Системные переменные, Изменить. По крайней мере, это должно выглядеть так:

%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem

Задайте дополнительные вопросы об этом на superuser.com

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