Переменные среды наследуются при запуске процесса, включая вызов 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")));
Надеюсь, это поможет,
С наилучшими пожеланиями,
Том.