来自`cmd`文件的进程的CreateProcess

时间:2012-03-16 13:34:07

标签: c++ winapi visual-c++

我正在尝试从不同的流程启动流程。实现这一目标的机制不会发生变化。启动器和原始进程都位于C:\dir

我正在从cmd文件启动我的启动器。 cmd文件本身位于其他位置,为了找到启动器可执行文件,我正在设置PATH变量:

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

返回0,上一个错误为2,即File not found

如果有帮助,GetCurrentDirectory会返回cmd所在的目录,而不是C:\dir。我猜CreateProcess找不到child.exe因为PATH不可用。

任何想法如何让这个工作?

编辑:一些好的评论和答案(评论有时会被忽视):

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

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

2 个答案:

答案 0 :(得分:6)

根据MSDN,CreateProcess实际执行搜索PATH,但仅当lpApplicationNameNULL并且可执行文件是lpCommandLine中的第一个令牌时。
换句话说,如果你致电CreateProcess(NULL, "child.exe", ...

工作

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

答案 1 :(得分:0)

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