【发布时间】:2014-03-27 22:04:45
【问题描述】:
我已成功使用VirtualFileDataObject code from Delay's blog,但我想避免将整个文件流式传输到内存中。
我在 Stack Overflow Drag and Drop large virtual files from c# to Windows Explorer 上找到了这个先前回答的问题,这个问题由 matthieu 通过更改 SetData 方法的签名来回答。
这是我的问题,更改SetData方法的签名后,调用它的其他地方仍在寻找旧的签名。
这里是原始的SetData;
public void SetData(short dataFormat, int index, Action<Stream> streamData)
{
_dataObjects.Add(
new DataObject
{
FORMATETC = new FORMATETC
{
cfFormat = dataFormat,
ptd = IntPtr.Zero,
dwAspect = DVASPECT.DVASPECT_CONTENT,
lindex = index,
tymed = TYMED.TYMED_ISTREAM
},
GetData = () =>
{
// Create IStream for data
var ptr = IntPtr.Zero;
var iStream = NativeMethods.CreateStreamOnHGlobal(IntPtr.Zero, true);
if (streamData != null)
{
// Wrap in a .NET-friendly Stream and call provided code to fill it
using (var stream = new IStreamWrapper(iStream))
{
streamData(stream);
}
}
// Return an IntPtr for the IStream
ptr = Marshal.GetComInterfaceForObject(iStream, typeof(IStream));
Marshal.ReleaseComObject(iStream);
return new Tuple<IntPtr, int>(ptr, NativeMethods.S_OK);
},
});
}
matthieu 建议改成;
public void SetData(short dataFormat, int index, Stream stream)
{
...
var iStream = new StreamWrapper(stream);
...
// Ensure the following line is commented out:
//Marshal.ReleaseComObject(iStream);
return new Tuple<IntPtr, int>(ptr, NativeMethods.S_OK);
...
}
在我进行这些更改后,以下调用将不起作用; (这是我需要帮助的地方) 我该如何解决这个电话;
foreach (var fileDescriptor in fileDescriptors)
{
**SetData(FILECONTENTS, index, fileDescriptor.StreamContents);**
index++;
}
基本上将“Action streamData”更改为“Stream stream”导致了我的问题。我不确定在更改后如何调用它。
所有这些代码都来自Delays VirtualFileDataObject。不知道该不该发在这里。但是,如果您点击上面的链接,它会将您带到博客,以便您查看它。
我已经很接近了,只是想不出最后一步,谢谢你看看
【问题讨论】:
标签: c# wpf drag-and-drop