从“cmd”文件启动的进程的 CreateProcess

CreateProcess from a process started from a `cmd` file

提问人:Luchian Grigore 提问时间:3/16/2012 最后编辑:Luchian Grigore 更新时间:3/16/2012 访问量:1374

问:

我正在尝试从其他进程启动进程。实现这一点的机制不会改变。启动器和原始进程都位于 中。C:\dir

我正在从文件启动启动器。文件本身位于其他地方,为了让它找到启动器可执行文件,我设置了变量:cmdcmdPATH

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

它返回最后一个错误是 ,即 。02File not found

如果有帮助,则返回 所在的目录,而不是 .我猜找不到,因为 PATH 不可用。GetCurrentDirectorycmdC:\dirCreateProcesschild.exe

任何想法如何让它工作?

编辑:一些带有答案的好评论(因为评论有时会被忽略):

建议:将 statupInfo.lpDirectory 设置为“c:\dir”

答:不能。我从cmd开始,因为目录可能会更改。

C WinAPI 可视化 C++

评论

2赞 Lucian 3/16/2012
将 statupInfo.lpDirectory 设置为“c:\\dir”
0赞 Luchian Grigore 3/16/2012
@Lucian不能。我从开始,因为目录可能会更改。cmd
0赞 WaffleSouffle 3/16/2012
为什么要弄乱PATH变量?如果cmd文件知道要启动的可执行文件的位置,为什么不将可执行文件的路径作为参数传递给命令行上的启动器呢?launcher.exe c:\dir\child.exe
0赞 Luchian Grigore 3/16/2012
@WaffleSouffle这只是旧工具生成的众多文件之一,不会发生更改。cmd
0赞 Deanna 3/16/2012
@LuchianGrigore。启动器进程可以获取自己的文件夹并使用它。无需更改路径变量或更改工作目录。

答:

5赞 molbdnilo 3/16/2012 #1

根据 MSDN 的说法,CreateProcess 实际上搜索 PATH,但前提是 is 并且可执行文件是 中的第一个标记。
换句话说,如果你调用,它应该可以工作
lpApplicationNameNULLlpCommandLineCreateProcess(NULL, "child.exe", ...

不过我还没有尝试过,所以 YMMV 等等。

0赞 Deanna 3/16/2012 #2

启动器进程可以使用该路径获取自己的路径,从而创建第二个可执行文件的完整路径。无需更改 Path 环境变量或更改工作方向。GetModuleFileName()

评论

0赞 Luchian Grigore 3/16/2012
两者不一定在同一个目录中。它们位于脚本在 PATH 中设置的目录中。
0赞 Deanna 3/17/2012
你说它们是“启动器和原始进程都位于 C:\dir 中”