我正在尝试从不同的流程启动流程。实现这一目标的机制不会发生变化。启动器和原始进程都位于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开始,因为目录可能会改变。答案 0 :(得分:6)
根据MSDN,CreateProcess实际执行搜索PATH,但仅当lpApplicationName
为NULL
并且可执行文件是lpCommandLine
中的第一个令牌时。
换句话说,如果你致电CreateProcess(NULL, "child.exe", ...
我没有尝试过,所以YMMV等等。
答案 1 :(得分:0)
启动程序进程可以使用GetModuleFileName()
获取自己的路径,它可以用来创建第二个可执行文件的完整路径。无需更改Path环境变量或更改工作directoy。