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

Luc*_*ore 2 c++ winapi visual-c++

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

我正在从cmd文件中启动我的启动器.该cmd文件本身位于其他地方,为了为它找到了启动程序可执行文件,我设置的PATH变量:

set PATH=C:\dir;%PATH%;
launcher.exe
Run Code Online (Sandbox Code Playgroud)

启动程序使用以下代码启动子进程:

  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);
Run Code Online (Sandbox Code Playgroud)

它返回0并且最后一个错误是2,即File not found.

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

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

编辑:一些好的评论与答案(因为评论有时被忽视):

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

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

mol*_*ilo 5

根据MSDN,CreateProcess的实际搜索路径,但仅当lpApplicationNameNULL和可执行文件中第一个标记lpCommandLine.
换句话说,如果你打电话它应该工作CreateProcess(NULL, "child.exe", ...

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