首页 新闻 搜索 专区 学院

创建进程成功但是进程并没有被执行。

0
悬赏园豆:20 [已解决问题] 解决于 2014-07-25 14:43
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("进程完毕。"));

在线程里面启动的进程,循环执行,前面启动的进程都会显示"创建进程","进程完毕",但是进程并未被执行。后面的进程才会真正的得到执行,这可能是什么原因啊?

Jingle Guo的主页 Jingle Guo | 初学一级 | 园豆:124
提问于:2014-07-25 10:36
< >
分享
最佳答案
0

CreateProcess(NULL, strCommand.GetBuffer(0), 这里的 strCommand 每次都是一样的吗?

收获园豆:20
Launcher | 高人七级 |园豆:45045 | 2014-07-25 11:26

是的,线程,进程里的代码都是一样的,并没有针对第一遍执行什么特殊的操作

Jingle Guo | 园豆:124 (初学一级) | 2014-07-25 11:29

@Jingle Guo: 你这个 strCommand 的内容是啥?

Launcher | 园豆:45045 (高人七级) | 2014-07-25 11:30

@Launcher: strCommand.Format(_T("cmd.exe /c \"%s %s\""), proname, jobxml.c_str());

proname 是exe的名字,jobxml是一个字符串参数。

启动的进程里面用

TCHAR* jobxml = argv[1];
OutputDebugString(jobxml);

命令在一开始就会输出传进的这个参数。但是第一遍并没有输出。

Jingle Guo | 园豆:124 (初学一级) | 2014-07-25 11:33

@Jingle Guo: 

CreateProcess(_T("cmd.exe"),_T(" /c \"proname.exe jobxml \""),....

Launcher | 园豆:45045 (高人七级) | 2014-07-25 11:35

@Launcher: 不行,创建进程出错

Jingle Guo | 园豆:124 (初学一级) | 2014-07-25 13:04

@Jingle Guo: CreateProcess_T("C:\\Windows\\system32\\cmd.exe"), _T("/c notepad.exe"),....

我问你个问题,为啥你要启动一个 .exe 程序,非得用 cmd.exe 来间接实现呢?

Launcher | 园豆:45045 (高人七级) | 2014-07-25 13:26

@Launcher: 我错了,我发现直接改成CreateProcess(NULL, "myprog.exe jobxml"....

后就好使了,我现在就是好奇一开始的运行方式为啥会导致第一遍ok,其后都不ok的呢?真是奇怪啊

Jingle Guo | 园豆:124 (初学一级) | 2014-07-25 13:38

@Jingle Guo: 其实一般我们都这么写:

 CreateProcess_T("X:\\xxx\\xxx\\myprog.exe"), _T(" jobxml"),....  // 注意 "jobxml" 前有个空格。

Launcher | 园豆:45045 (高人七级) | 2014-07-25 13:47

@Launcher: 喔,谢谢,顺便问一句,这种创建进程的方式是不是只能不能直接获得其返回值,而必须通过被启动的进程输出到文本文件中,再通过读取文件内容来获取运行结果啊?

Jingle Guo | 园豆:124 (初学一级) | 2014-07-25 13:53

@Jingle Guo: 也可以通过 STARTUPINFO.hStdOutput 获取输出,具体请看重定向标准输入输出流。

Launcher | 园豆:45045 (高人七级) | 2014-07-25 14:04

@Launcher: 我的意思是被启动进程里面的 int main里面返回0或者其他值是不是没有特别方便的方法得到啊?

Jingle Guo | 园豆:124 (初学一级) | 2014-07-25 14:09

@Jingle Guo: 进程退出后,用 GetExitCodeProcess 获取“main里面返回0”,子进程可以将数据写入标准输出流中,父进程通过子进程的标准输出流来读取(STARTUPINFO.hStdOutput)。有些概念,我提一下,你就该自己去查资料搞清楚,避免我重复回答。

Launcher | 园豆:45045 (高人七级) | 2014-07-25 14:19
Launcher | 园豆:45045 (高人七级) | 2014-07-25 14:25

@Jingle Guo: 再给你个例子;http://blog.csdn.net/jiaweizou/article/details/7731999

Launcher | 园豆:45045 (高人七级) | 2014-07-25 14:27

@Launcher: 谢谢,如果我说我后面想问的就是GetExitCodeProcess,不是STARTUPINFO.hStdOutput,你会不会很郁闷啊。。。

Jingle Guo | 园豆:124 (初学一级) | 2014-07-25 14:45

@Jingle Guo: 是挺郁闷,你要说获取进程的终止状态就不会有歧义了。

Launcher | 园豆:45045 (高人七级) | 2014-07-25 15:06

@Launcher: 喔,呵呵,不好意思,一时不知道怎么表述啊

Jingle Guo | 园豆:124 (初学一级) | 2014-07-25 15:45
其他回答(1)
0

你是如何判断进程未被执行的?

空明流光 | 园豆:62 (初学一级) | 2014-07-25 11:01

被启动的进程里面一开始就有OutputDebugString,但是该命令并未被执行

支持(0) 反对(0) Jingle Guo | 园豆:124 (初学一级) | 2014-07-25 11:03

@Jingle Guo: 你知道 OutputDebugString 会将信息输出到哪里吗?

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-07-25 11:10

@Launcher: 我启动了debugview,前面的进程没有输出信息,但是后面的进程输出信息了。

支持(0) 反对(0) Jingle Guo | 园豆:124 (初学一级) | 2014-07-25 11:16

@Jingle Guo: 你的前面后面的是什么意思?

支持(0) 反对(0) Launcher | 园豆:45045 (高人七级) | 2014-07-25 11:18

@Launcher: 循环启动某线程,线程里面启动的进程,所以该启动进程操作不止进行一次,而是多次,大概第一次会失败,后面会成功

支持(0) 反对(0) Jingle Guo | 园豆:124 (初学一级) | 2014-07-25 11:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册