我通过ShellExecute调用了一个可执行文件,目的是从服务器下载一个文件,之后在本地打开这个文件,但是下载需要一定的时延,因此导致打开文件会出错,如何才能判断文件已经下载完毕?我原本想通过Sleep等待,但它的等待时间参数不确定,该怎么办?

解决方案 »

  1.   

    不知WaitForSingleObject的参数hHandle如何设置,唉!
      

  2.   

    下面是一个MSDN中的小例子,希望能对您有所帮助。不过用的是createprocess,和shellexecute差不多void main( VOID )
    {
        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 );
    }
      

  3.   

    shellexecute不行,只能用createprocess
      

  4.   

    http://www.vckbase.com/document/viewdoc.asp?id=416Q: 如何启动一个程序,直到它运行结束? 
    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);
      

  5.   

    SHELLEXECUTEINFO sei;
    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);
      

  6.   

    shellexecute就返回一个句柄,然后用waitforsingleobject等待就行
      

  7.   

    谢谢各位!通过你们的帮助,我的问题解决了,简单说一下:
    上面的几段代码我都试了
       CreateProcess和ShellExecuteEx不知为什么,在执行命令的时候和我用ShellExecute执行结果不一样,使用ShellExecute创建的word文件是19k(正常情况),而用另外两个就只有4k,然后还会出现IE错误
       最终采用tangrh(阿唐)的解决方法,我真笨,竟然没想到ShellExecute返回的句柄!
    再次谢谢各位!
      

  8.   

    用URLDownloadToFile下载到本地再打开……
      

  9.   

    真是对不起 laiyiling(最熟悉的陌生人) 和 alon21(飘一族.Alon) ,你们的方法也是可行的,我重新测了几遍,发现问题出在下在调用的那个可执行文件里面了,修改之后就可以了。
        
    to jiangsheng(蒋晟.MSMVP2004Jan):
       一开始我也是用URLDownloadToFile下载文件的,可是发现他有问题:比如线下载一word文件,然后本地修改,后有保存上传,并且上传后删除,但当我再重新下载打开这个文件时,发现是上一次下载的文件内容,修改的部分也没见着。我怀疑是第一次下载保存在cache中,第二次下载就直接从cache中找了,所以会出现这个问题,这是我的猜测,不知对否?
        所以最后自己写了一个下载的(也是参考别人的)。
    另外:
        我发现
        WaitForSingleObject(hHandle,dwMilliseconds);中dwMilliseconds用INFINITE之后就会等待很长时间才会有响应,换上其他的数值(200000),就会又比较快的响应,请问这个参数意思是不是进程没有执行完就一直等待,直到进程执行完或者时间值dwMilliseconds结束?还是不管进程有没执行完,都要等待dwMilliseconds?
      

  10.   

    那个wait的时间INFINITE实际上是dword(-1),换成毫秒你去算,所以这个等待就堵住了,因此,如果你的等待线程是主线程,很显然不能这么干,而是要等待一个很短的时间,如果你想始终等待,那么必须循环,在循环里让windows的消息循环得以继续,否则windows就会认为你的程序无响应。
    看msdn就明白各返回结果的含义
      

  11.   

    URLDownloadToFile下载是会先判断缓存里面有没有文件的,但是记得有个参数可以强制从网站上下载来者
      

  12.   

    我用了WaitForMultipleObjects等待我线程的返回,线程执行完了,返回竟然不是0,我在控件中用的,是不是和搂主的一样