strCommand.Format(_T("cmd.exe /c \"%s %s\""), proname, jobxml.c_str()); OutputDebugString(strCommand); //创建一个不要出现DOS窗口的、影藏的命令执行线程 STARTUPINFO si; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(STARTUPINFO); si.wShowWindow = SW_HIDE; si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; PROCESS_INFORMATION pi; BOOL res = CreateProcess(NULL, strCommand.GetBuffer(0), NULL, NULL, NULL, NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW, NULL, NULL, &si, &pi); if (!res) { OutputDebugString(_T("创建进程出错。")); return -1; } OutputDebugString(_T("创建进程")); //等待进程执行完毕 WaitForSingleObject(pi.hProcess, INFINITE); OutputDebugString(_T("进程完毕。"));
在线程里面启动的进程,循环执行,前面启动的进程都会显示"创建进程","进程完毕",但是进程并未被执行。后面的进程才会真正的得到执行,这可能是什么原因啊?
CreateProcess(NULL, strCommand.GetBuffer(0), 这里的 strCommand 每次都是一样的吗?
是的,线程,进程里的代码都是一样的,并没有针对第一遍执行什么特殊的操作
@Jingle Guo: 你这个 strCommand 的内容是啥?
@Launcher: strCommand.Format(_T("cmd.exe /c \"%s %s\""), proname, jobxml.c_str());
proname 是exe的名字,jobxml是一个字符串参数。
启动的进程里面用
TCHAR* jobxml = argv[1];
OutputDebugString(jobxml);
命令在一开始就会输出传进的这个参数。但是第一遍并没有输出。
@Jingle Guo:
CreateProcess(_T("cmd.exe"),_T(" /c \"proname.exe jobxml \""),....
@Launcher: 不行,创建进程出错
@Jingle Guo: CreateProcess_T("C:\\Windows\\system32\\cmd.exe"), _T("/c notepad.exe"),....
我问你个问题,为啥你要启动一个 .exe 程序,非得用 cmd.exe 来间接实现呢?
@Launcher: 我错了,我发现直接改成CreateProcess(NULL, "myprog.exe jobxml"....
后就好使了,我现在就是好奇一开始的运行方式为啥会导致第一遍ok,其后都不ok的呢?真是奇怪啊
@Jingle Guo: 其实一般我们都这么写:
CreateProcess_T("X:\\xxx\\xxx\\myprog.exe"), _T(" jobxml"),.... // 注意 "jobxml" 前有个空格。
@Launcher: 喔,谢谢,顺便问一句,这种创建进程的方式是不是只能不能直接获得其返回值,而必须通过被启动的进程输出到文本文件中,再通过读取文件内容来获取运行结果啊?
@Jingle Guo: 也可以通过 STARTUPINFO.hStdOutput 获取输出,具体请看重定向标准输入输出流。
@Launcher: 我的意思是被启动进程里面的 int main里面返回0或者其他值是不是没有特别方便的方法得到啊?
@Jingle Guo: 进程退出后,用 GetExitCodeProcess 获取“main里面返回0”,子进程可以将数据写入标准输出流中,父进程通过子进程的标准输出流来读取(STARTUPINFO.hStdOutput)。有些概念,我提一下,你就该自己去查资料搞清楚,避免我重复回答。
@Jingle Guo: 给你例子:http://www.cppblog.com/mydriverc/articles/28503.html
@Jingle Guo: 再给你个例子;http://blog.csdn.net/jiaweizou/article/details/7731999
@Launcher: 谢谢,如果我说我后面想问的就是GetExitCodeProcess,不是STARTUPINFO.hStdOutput,你会不会很郁闷啊。。。
@Jingle Guo: 是挺郁闷,你要说获取进程的终止状态就不会有歧义了。
@Launcher: 喔,呵呵,不好意思,一时不知道怎么表述啊
你是如何判断进程未被执行的?
被启动的进程里面一开始就有OutputDebugString,但是该命令并未被执行
@Jingle Guo: 你知道 OutputDebugString 会将信息输出到哪里吗?
@Launcher: 我启动了debugview,前面的进程没有输出信息,但是后面的进程输出信息了。
@Jingle Guo: 你的前面后面的是什么意思?
@Launcher: 循环启动某线程,线程里面启动的进程,所以该启动进程操作不止进行一次,而是多次,大概第一次会失败,后面会成功