繁体   English   中英

从`cmd`文件开始的进程的CreateProcess

[英]CreateProcess from a process started from a `cmd` file

我正在尝试从其他进程启动一个进程。 实现这一目标的机制不会改变。 启动器和原始进程都位于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开始,因为目录可能会更改。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM