提问人:Luchian Grigore 提问时间:3/16/2012 最后编辑:Luchian Grigore 更新时间:3/16/2012 访问量:1374
从“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
如果有帮助,则返回 所在的目录,而不是 .我猜找不到,因为 PATH 不可用。GetCurrentDirectory
cmd
C:\dir
CreateProcess
child.exe
任何想法如何让它工作?
编辑:一些带有答案的好评论(因为评论有时会被忽略):
建议:将 statupInfo.lpDirectory 设置为“c:\dir”
答:不能。我从cmd开始,因为目录可能会更改。
答:
5赞
molbdnilo
3/16/2012
#1
根据 MSDN 的说法,CreateProcess 实际上会搜索 PATH,但前提是 is 并且可执行文件是 中的第一个标记。
换句话说,如果你调用,它应该可以工作lpApplicationName
NULL
lpCommandLine
CreateProcess(NULL, "child.exe", ...
不过我还没有尝试过,所以 YMMV 等等。
0赞
Deanna
3/16/2012
#2
启动器进程可以使用该路径获取自己的路径,从而创建第二个可执行文件的完整路径。无需更改 Path 环境变量或更改工作方向。GetModuleFileName()
评论
0赞
Luchian Grigore
3/16/2012
两者不一定在同一个目录中。它们位于脚本在 PATH 中设置的目录中。
0赞
Deanna
3/17/2012
你说它们是“启动器和原始进程都位于 C:\dir 中”
评论
cmd
launcher.exe c:\dir\child.exe
cmd