在VisualStudio.NETC++中运行的进程中使用的操作系统(XP)环境变量是相同的吗?
似乎找不到命令解释器:
使用空作为命令时,system() returns 0和命令-ENOENT Command interpreter cannot be found
在windows(系统->环境变量)中,comspec包含指向cmd.exe的路径
路径没有。
路径应该是什么?
除此之外,不知道为什么找不到翻译。
如有任何建议,我们将不胜感激。谢谢。

  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 ));

  }

编辑1
单步执行system()argv[0] = _tgetenv(_T("COMSPEC"));返回错误的指针。由于这是一个cgi可执行文件,compsec没有正确设置或从操作系统继承。
我现在在进程启动之前设置comspec,并使用createprocess()如example 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变量会发生变化?

最佳答案

运行进程时继承环境变量,包括system(...)调用。除非发生了奇怪的事情,通常运行%windir%\system32\cmd.exe就可以了,否则它应该展开环境变量,除非您可以使用api获取windows目录“GetWindowsDirectory”。有关MSDN的示例,请参见此处。
编辑:iirc,comspec环境变量,如果在命令行上完成
>回显%comspec%
C:\ windows\system32\cmd.exe
你的指针不正确,因为它可能没有设置,上面的echo命令应该证明,如果没有输出,它没有设置,右键单击“我的电脑”,左键单击“属性”,出现一个带有选项卡页的对话框,单击“高级”,查找“环境变量”…请参阅此处的两个屏幕截图…
另外,我应该指出,您正在临时设置环境变量,因此它将看不到“comspec”……它不是永久的,唯一永久的方法是按照屏幕截图…
我想把截图放好…
alt text http://img706.imageshack.us/img706/9434/envvars.png
alt text http://img638.imageshack.us/img638/5743/comspec.png
编辑第2页:
只是指出这一点,当您在这里设置环境变量时,这是临时的,而不是永久的!
如果(!)setenvironmentvariable(“comspec”,“c:\\windows\\system32\\cmd.exe”))
{
printf(“setEnvironmentVariable失败(%d\n”,getLastError());
}
//r=system(“dir c:\\”);
r=createprocess(“dir.exe”,空,空,空,真,空,
null,//继承父环境
空,&si,&pi);
当使用调用CreateProcess时,它肯定会失败,请查看注释“继承父环境”,因为环境是临时设置的,所以不会发生这种情况。你测试过简单的echo命令吗?没有设置comspec变量的原因出了问题..永久设置后-需要重新启动计算机才能使其工作。然后上面的echo命令应该显示该环境变量的值,然后依次显示
argv[0]=strdup(_tgetenv(_t(“comspec”));
应该返回一个正确的指针…顺便说一句,我认为它也应该是…
编辑3:当我使用了“&pi”时,我注意到它变成了一个pi符号!……嗯,现在已经修改了……我也在这里修改了这个‘argv’代码:
argv[0]=_tcsdup(_tgetenv(_t(“comspec”));
希望能帮上忙,
谨致问候,
汤姆。

09-07 22:23