我用ShellExecute函数执行了另外一个程序,我想等这个程序结束再接着执行程序,有什么办法啊,急啊,不用sleep函数
我在我的程序中,先调用了一个批处理,让他编译一些工程,我要用编译好的东西,所以等他执行完,确切的完成。所以不用sleep,我该怎么样才能完成这样,还是的开一个进程来代替ShellExecute,那又该怎么做!先谢谢大家了! 问题点数:20、回复次数:19Top
1 楼CuteSword(灵剑)回复于 2005-01-24 12:38:28 得分 2
ShellExecute 好像只是启动一个进程吧,你只有检查 nResult = ShellExecute(...)的返回结果来判断是否执行成功,至于什么时候这个进程完成,好像不是这个函数的责任。Top
2 楼wangzhanlili(小木头)回复于 2005-01-24 12:42:40 得分 2
你用一个线程检查用ShellExecute 生成的进程是否存在
不在了就执行下一个Top
3 楼shenailin(sal)回复于 2005-01-24 12:43:31 得分 0
在匹处理中加结束符好 !
再调用ShellExecuteTop
4 楼kvls(冰茶)回复于 2005-01-24 12:45:21 得分 2
使用CreateProcess启动进程,返回为一内核量,然后调用WaitForSingleObject函数,具体参考MSDNTop
5 楼handwolf(青松崖)回复于 2005-01-24 12:47:19 得分 0
WaitForSingleObject
Top
6 楼shootingstars(有容乃大,无欲则刚)回复于 2005-01-24 12:48:58 得分 2
用CreateProcess创建进程,然后可以用获得的进程句柄来WaitForSingleObjectTop
7 楼woshixhs(纯净水)回复于 2005-01-24 12:50:41 得分 0
nResult = ShellExecute(...)的返回结果来判断是否执行成功,至于什么时候这个进程完成,好像不是这个函数的责任。
这个nResult值得到是不会变的Top
8 楼fengqinggao(风清高)回复于 2005-01-24 12:50:50 得分 10
如下方法可以实现你的要求:
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
CString sExePathName = “你要执行文件的路径和名称”;
if(!CreateProcess(NULL, sExePathName.GetBuffer(sExePathName.GetLength()), NULL, NULL, NULL, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
AfxMessageBox(" 运行 “" + sExeModel + "” 模块失败! ");
else
WaitForSingleObject(pi.hProcess, INFINITE);
关键在于CreateProcess()和WaitForSingleObject()函数的配合使用,前者成功后,用或者等待那个进程结束后才能进行其他操作Top
9 楼woshixhs(纯净水)回复于 2005-01-24 12:51:37 得分 0
WaitForSingleObject
在这里好像不能用的吧Top
10 楼fengqinggao(风清高)回复于 2005-01-24 12:53:31 得分 0
呵呵,正在整理代码的时候被shootingstars(有容乃大,无欲则刚)兄占了先,不好意思
顺便补充一下,上面语句中,sExeModel应该用sExePathName代替Top
11 楼woshixhs(纯净水)回复于 2005-01-24 12:55:00 得分 0
我就是在批处理中加的结束符,但是我不能控制啊
Top
12 楼zhjie374(zhjie374)回复于 2005-01-24 12:58:25 得分 0
用个笨办法,写个信号到文件,或者共享内存.Top
13 楼woshixhs(纯净水)回复于 2005-01-24 13:03:09 得分 0
我先试试在说,先谢谢了,看能否成功Top
14 楼fengqinggao(风清高)回复于 2005-01-24 13:13:10 得分 0
是啊,只能先试一试了,我没有用它处理过批处理,呵呵,反正调用一般的单个的应用程序没有问题
个人直觉,批处理,够戗,而且我也想不出其他方法处理这种情况,呵呵,除非你将批处理中的执行代码都转换成这种代码,:)Top
15 楼XunBaian(蓝水晶)回复于 2005-01-24 13:17:55 得分 2
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "要执行的文件";
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
Top
16 楼woshixhs(纯净水)回复于 2005-01-24 13:29:40 得分 0
楼上的这个我没事,其实应该跟fengqinggao(风清高) 原理的一样,我已经成功了,谢谢了。我有这个相法这么用,就是不熟悉而已,现在好了,学了很多。再次谢谢各位了!Top
17 楼chuanke((C ) 2005【空间代数】. All rights reserved .)回复于 2005-01-24 14:11:02 得分 0
路过Top
18 楼xiejingking(石头)回复于 2005-02-24 23:31:17 得分 0
能给出完整的实现过程和代码吗,非常感谢!急等Top
19 楼kyh1234567(曾一坤)回复于 2005-04-19 17:29:02 得分 0
UPTop




