现在已经根据 MSDN 中“Handling Shell Data Transfer Scenarios”的“Transfering Data to and from Virtual Folders”说明实现了从普通应用程序通过剪贴板复制虚拟文件到 Shell,但在Shell通过我提供的IStream::Read获取数据的时候,由于我的数据是从网络获取,导致Read阻塞界面,是否有什么方法可以另Shell在后台线程读数据或者在IStream::Read返回特定值让Shell知道暂时没有数据等一下继续?

解决方案 »

  1.   

    另开线程从网络读取数据,IStream也在这个线程中提供。
      

  2.   


    IStream是Shell主动请求的,我能自己开线程让Shell在这个线程里请求吗?根据测试所得 IASyncOperation 只是为了避免拖放操作的阻塞,而不是在读数据时异步,这个我也已经实现了。然而Shell通过我提供的IStream接口读数据的时候,如果在 Read 里面Sleep,当前Shell窗口还是会被阻塞。或许我还有什么地方没有做好?请蒋老大再帮忙。
      

  3.   

    工作线程仅仅负责数据下载和缓存,提供的IStream::Read方法完全可以不阻塞,有多少数据就返回多少数据
      

  4.   


    这个方法已经想过了,而且是最后才使用,但有个问题是如果缓存中暂时没有数据,IStream::Read 不能返回任何错误,也不能 *pcbRead = 0; 并返回 S_OK, 因为这样会导致复制过程中止。虽然这种情况我也有方法解决,但还是想知道有没有方法令 Shell 在不同的线程读数据,不用阻塞界面,据我了解 IStream 是可以支持异步的,或许我理解错了,也许这种复制方法只支持同步方式,还是想知道有没有其他情况。网上找了很多资料都没有结果,COM也不是了解得很深。请大家帮忙,谢谢!
      

  5.   

    为何从COleDataObject能获取到IDataObject接口,再去从IDataObject接口去取IAsyncOperation接口和IStream接口时取不到呢?
    该如何去接受这种虚拟文件(拖放或剪贴板中)的数据呢?