2

我有一个带有小图像缩略图的列表视图。每个图像都有一个标签,其中包含完整路径。

使用右键菜单,用户可以单击复制。

然后执行此代码:

Dim selectedfile As String

selectedfile = Me.lvFotos.SelectedItems(0).Tag


Dim dataobj As New DataObject(DataFormats.FileDrop, selectedfile)

Clipboard.Clear()
Clipboard.SetDataObject(dataobj)

现在,当我单击桌面粘贴文件时,VS2010 中出现异常错误:

System.Windows.Forms.dll 中发生“System.Runtime.InteropServices.COMException”类型的异常,并且在托管/本机边界之前未处理

附加信息:无效的 FORMATETC 结构(来自 HRESULT 的异常:0x80040064 (DV_E_FORMATETC))

我在这里做错了什么?

rg. 埃里克

4

3 回答 3

4

可以直接使用My.Computer.FileSystem.CopyFile

Dim source As String = lvFotos.SelectedItems(0).Tag
Dim destination As String = My.Computer.FileSystem.SpecialDirectories.Desktop & from.Substring(from.LastIndexOf("\"))
My.Computer.FileSystem.CopyFile(source, destination)
于 2014-09-15T15:58:13.667 回答
2

使用 John Smith 在Copying a File To The Clipboard中的代码:

Dim f() As String = {"C:\temp\Folder.jpg"}
Dim d As New DataObject(DataFormats.FileDrop, f)
Clipboard.SetDataObject(d, True)

(测试为在 Windows 7 x64 上的 VS2013 中工作。)

请注意,您必须传递代表文件名的字符串数组,因此如果您愿意,可以允许用户在粘贴之前收集多个项目。

当您退出程序时, trueinClipboard.SetDataObject允许数据保留在剪贴板上,因此如果用户在粘贴之前选择一个文件并退出,他们不会丢失他们的选择。

于 2014-09-15T19:03:02.723 回答
1

发现我做错了什么。

起初我用数组中的文件名尝试过它,但这给出了同样的错误。

现在我有这样的:

 Dim selectedfile(0) As String

selectedfile(0) = Me.lvFotos.SelectedItems(0).Tag

Dim dataobj As New DataObject

dataobj.SetData(DataFormats.FileDrop, True, selectedfile)

Clipboard.Clear()
Clipboard.SetDataObject(dataobj, True)

不同之处在于与 SETDATA 一致。通过在 SetData 和 SetDataObject 中将第二个参数设置为 TRUE,它开始工作。

于 2014-09-16T13:38:57.633 回答