[英]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,但lpApplicationName
是lpApplicationName
为NULL
并且可执行文件是lpCommandLine
的第一个标记。
换句话说,如果你调用它应该工作CreateProcess(NULL, "child.exe", ...
我还没有尝试过,所以YMMV等等。
启动程序进程可以使用GetModuleFileName()
获取其自己的路径,该程序可用于创建第二个可执行文件的完整路径。 无需更改Path环境变量或更改工作目录。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.