我通过ShellExecute调用了一个可执行文件,目的是从服务器下载一个文件,之后在本地打开这个文件,但是下载需要一定的时延,因此导致打开文件会出错,如何才能判断文件已经下载完毕?我原本想通过Sleep等待,但它的等待时间参数不确定,该怎么办?
解决方案 »
- 学习 陆其明老师 directshow实务精选 代码avcap 中遇到问题:可以grab但是不能capture
- 界面线程等待工作线程的处理结果,而工作线程却得不到CPU时间!真晕!
- 在线程里调用DIALOG类里的函数时报RUNTIME ERROR,怎样解决?
- 哪里有vc6.0下载?
- 如何将声音进行压缩?只能给一百分,不够再加,急!!!!
- 请高手帮忙看一下,这一段程序怎么工作?下一步做什么?
- 高分求助!VC如果查找WORD里是否包含指定的字符?
- MFC如何实现从字符串中提取到double型的数据,求代码
- 计划用纯c++开发一套类似于c#一样的类库,欢迎加入和讨论
- 二百以内质数加和怎么编程V++
- MSDN2003中文版能用于VC6英文版吗?
- 高分求取DirectX SDK的详细开发文档.(急急!)
{
STARTUPINFO si;
PROCESS_INFORMATION pi; ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) ); // 创建子进程
if( !CreateProcess( NULL, // No module name (use command line).
"MyChildProcess", // Command line.
NULL, // Process handle not inheritable.
NULL, // Thread handle not inheritable.
FALSE, // Set handle inheritance to FALSE.
0, // No creation flags.
NULL, // Use parent's environment block.
NULL, // Use parent's starting directory.
&si, // Pointer to STARTUPINFO structure.
&pi ) // Pointer to PROCESS_INFORMATION structure.
)
{
ErrorExit( "CreateProcess failed." );
} // 等待子进程退出
WaitForSingleObject( pi.hProcess, INFINITE ); // 关闭句柄
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
}
SHELLEXECUTEINFO ShExecInfo = {0};
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = NULL;
ShExecInfo.lpFile = "c:\\MyProgram.exe";
ShExecInfo.lpParameters = "";
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess,INFINITE);
memset(&sei, 0, sizeof(SHELLEXECUTEINFO)); sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.fMask = SEE_MASK_NOCLOSEPROCESS;
sei.lpVerb = _T("open");
sei.lpFile = _T("aa.exe");
sei.nShow = SW_SHOWDEFAULT;
ShellExecuteEx(&sei);WaitForSingleObject(sei.hProcess, INFINITE);
CloseHandle(sei.hProcess);
上面的几段代码我都试了
CreateProcess和ShellExecuteEx不知为什么,在执行命令的时候和我用ShellExecute执行结果不一样,使用ShellExecute创建的word文件是19k(正常情况),而用另外两个就只有4k,然后还会出现IE错误
最终采用tangrh(阿唐)的解决方法,我真笨,竟然没想到ShellExecute返回的句柄!
再次谢谢各位!
to jiangsheng(蒋晟.MSMVP2004Jan):
一开始我也是用URLDownloadToFile下载文件的,可是发现他有问题:比如线下载一word文件,然后本地修改,后有保存上传,并且上传后删除,但当我再重新下载打开这个文件时,发现是上一次下载的文件内容,修改的部分也没见着。我怀疑是第一次下载保存在cache中,第二次下载就直接从cache中找了,所以会出现这个问题,这是我的猜测,不知对否?
所以最后自己写了一个下载的(也是参考别人的)。
另外:
我发现
WaitForSingleObject(hHandle,dwMilliseconds);中dwMilliseconds用INFINITE之后就会等待很长时间才会有响应,换上其他的数值(200000),就会又比较快的响应,请问这个参数意思是不是进程没有执行完就一直等待,直到进程执行完或者时间值dwMilliseconds结束?还是不管进程有没执行完,都要等待dwMilliseconds?
看msdn就明白各返回结果的含义