使用COM将虚拟文件从.net复制到资源管理器



我试图在VB中使用IStream。. NET使用包装器类将虚拟文件复制到Windows资源管理器,该包装器类将调用链到我自己的IO。流实现。

我正在使用我自己的IDataObject实现来传输数据到资源管理器使用CFSTR_FILEDESCRIPTOR和CFSTR_FILECONTENTS。

一切似乎都很好(即使是>1GB的文件),除了目标Windows资源管理器窗口停止响应,直到操作完成。

这里的答案- CFSTR_FILEDESCRIPTOR/CFSTR_FILECONTENTS '复制文件'缺少对话没有帮助。

我的IDataObject实现是基于https://svn.cyberduck.io/tags/release-4-0/source/ch/cyberduck/core/VirtualFileDataObject.cs

不同之处在于,我没有在复制之前将整个虚拟文件加载到内存中,而是将CFSTR_FILECONTENTS设置为一个指针,该指针指向具有以下函数的IStream实现:
Public Sub Read(pv() As Byte, cb As Integer, pcbRead As IntPtr) Implements IStream.Read
    Marshal.WriteInt64(pcbRead, 0, stream.Read(pv, 0, cb))
End Sub

澄清:我正试图将文件从我的应用程序传输到Windows资源管理器,而不是其他方式。

任何帮助都将非常感激。

抱歉我的英语不好

您可以实现IDataObjectAsyncCapability接口,以允许Explorer异步提取数据。

请参阅异步拖放Shell对象以了解其工作原理。删除源需要采取的异步运行步骤如下:

  1. 创建一个公开IAsyncOperation/IDataObjectAsyncCapability的数据对象
  2. 调用SetAsyncMode,并将fDoOpAsync设置为VARIANT_TRUE,以表明支持异步操作。
  3. 在DoDragDrop返回后,调用InOperation:
    • 如果InOperation失败或返回VARIANT_FALSE,表示已经进行了正常的同步数据传输放置和数据提取过程完成。消息来源应该做任何需要的清理,然后继续。
    • 如果InOperation返回VARIANT_TRUE表示正在异步提取数据。清理操作应该由EndOperation处理。
  4. 释放数据对象
  5. 当异步数据传输完成后,数据对象通常通过私有接口通知源。

最新更新