虚拟文件通过粘贴板,复制到Shell,怎么实现异步?

aa3000 2009-02-11 04:49:13
现在已经根据 MSDN 中“Handling Shell Data Transfer Scenarios”的“Transfering Data to and from Virtual Folders”说明实现了从普通应用程序通过剪贴板复制虚拟文件到 Shell,但在Shell通过我提供的IStream::Read获取数据的时候,由于我的数据是从网络获取,导致Read阻塞界面,是否有什么方法可以另Shell在后台线程读数据或者在IStream::Read返回特定值让Shell知道暂时没有数据等一下继续?
...全文
197 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
小菩提的尾巴 2012-08-10
  • 打赏
  • 举报
回复
也遇到这种问题,楼主解决了没,能否说下,好纠结。。。
starsite 2010-09-16
  • 打赏
  • 举报
回复
请问LZ的问题解决了么?我现在也遇到这个问题了。不知如何解决。
MZHTCP 2009-07-06
  • 打赏
  • 举报
回复
为何从COleDataObject能获取到IDataObject接口,再去从IDataObject接口去取IAsyncOperation接口和IStream接口时取不到呢?
该如何去接受这种虚拟文件(拖放或剪贴板中)的数据呢?
aa3000 2009-02-18
  • 打赏
  • 举报
回复
没有更好的答案,结帖了。
aa3000 2009-02-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 jameshooo 的回复:]
工作线程仅仅负责数据下载和缓存,提供的IStream::Read方法完全可以不阻塞,有多少数据就返回多少数据
[/Quote]

这个方法已经想过了,而且是最后才使用,但有个问题是如果缓存中暂时没有数据,IStream::Read 不能返回任何错误,也不能 *pcbRead = 0; 并返回 S_OK, 因为这样会导致复制过程中止。虽然这种情况我也有方法解决,但还是想知道有没有方法令 Shell 在不同的线程读数据,不用阻塞界面,据我了解 IStream 是可以支持异步的,或许我理解错了,也许这种复制方法只支持同步方式,还是想知道有没有其他情况。网上找了很多资料都没有结果,COM也不是了解得很深。请大家帮忙,谢谢!
jameshooo 2009-02-12
  • 打赏
  • 举报
回复
工作线程仅仅负责数据下载和缓存,提供的IStream::Read方法完全可以不阻塞,有多少数据就返回多少数据
roadblossom 2009-02-12
  • 打赏
  • 举报
回复
up
hemdacker 2009-02-12
  • 打赏
  • 举报
回复
能不能换个想法,先保存成一个文件,然后去读,读完了清空。每次去检查文件是否为空。
aa3000 2009-02-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jameshooo 的回复:]
另开线程从网络读取数据,IStream也在这个线程中提供。
[/Quote]

IStream是Shell主动请求的,我能自己开线程让Shell在这个线程里请求吗?


[Quote=引用 3 楼 jiangsheng 的回复:]
IASyncOperation
[/Quote]

根据测试所得 IASyncOperation 只是为了避免拖放操作的阻塞,而不是在读数据时异步,这个我也已经实现了。然而Shell通过我提供的IStream接口读数据的时候,如果在 Read 里面Sleep,当前Shell窗口还是会被阻塞。或许我还有什么地方没有做好?请蒋老大再帮忙。
蒋晟 2009-02-11
  • 打赏
  • 举报
回复
IASyncOperation
jameshooo 2009-02-11
  • 打赏
  • 举报
回复
另开线程从网络读取数据,IStream也在这个线程中提供。
闪破风浪 2009-02-11
  • 打赏
  • 举报
回复
暂时没看懂~

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧