寻找帮助,试图弄清楚为什么这种类型转换不能在我的机器上运行
此代码是answer提供给我的另一个问题而且它不适用于我。它适用于他们机器上的答案海报,但我在尝试从ShellBrowserWindow
到ShellFolderView
进行类型转换的行上有例外。
我正在使用 Visual Studio Express 2013 ,在 Windows 7 Pro X64 Sp1 上运行。该项目的目标框架是.Net Framework 4
。我已添加对Microsoft Internet Controls
和Microsoft Shell Controls and Automation
的引用,并且我已为Imports
和Shell32
添加了SHDocVw
语句。 DLL版本如下: shell32.dll = 6.1.7601.18517 和 shdocvw.dll = 6.1.7601.1822 我不确定我可能缺少什么。
代码看起来像这样。 (此代码位于表单对象中)
Imports EdmLib
Imports Shell32
Imports SHDocVw
Public Class BlankForm
Private Sub BlankForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim bar As String() = GetExplorerSelectedFiles()
Exit Sub
'The rest of my program is below this line - I'm just trying to test this one function right now...
End Sub
'Uses the windows shell to get the files selected in explorer
Public Function GetExplorerSelectedFiles() As String()
Dim ExplorerFiles As New List(Of String)
Dim exShell As New Shell32.Shell
Dim SFV As Shell32.ShellFolderView
For Each window As SHDocVw.ShellBrowserWindow In DirectCast(exShell.Windows, SHDocVw.IShellWindows)
If (window.Document).GetType.Name <> "HTMLDocumentClass" Then
SFV = CType(window.Document, ShellFolderView) '<--This is where it fails!!
For Each fi As FolderItem In SFV.SelectedItems
ExplorerFiles.Add(fi.Path)
Next
End If
Next
Return ExplorerFiles.ToArray
End Function
End Class
行SFV = CType(window.Document, ShellFolderView)
会产生以下消息:
未处理的类型&#39; System.InvalidCastException&#39;发生了 在LaunchTemplateEPDM.exe
中附加信息:无法转换类型的COM对象 &#39;系统.__ ComObject&#39;接口类型&#39; Shell32.ShellFolderView&#39;。这个 操作失败,因为QueryInterface调用COM组件 用于与IID&#39; {29EC8E6C-46D3-411F-BAAA-611A6C9CAC66}&#39;的接口。 由于以下错误而失败:不支持此类接口 (HRESULT异常:0x80004002(E_NOINTERFACE))。
我已在window
对象上截取了一张快速计划的屏幕截图。 window.document
对象上的快速监视器显示错误,指出它未定义或无法访问。
我运行了查询Microsoft.VisualBasic.Information.TypeName(window.document)
并返回&#34; IShellFolderViewDual3&#34;。
答案 0 :(得分:0)
我修好了。
不知道为什么这会发生在我的系统而不是你的系统上。
我发现GetType.Name
总是只返回&#34; System .__ ComObject&#34; ,无论对象是ShellFolderView
类型,HTMLDocumentClass
或者是其他东西。所以发生的事情是无论对象的实际类型是什么,它都是通过<>"HTMLDocumentClass"
测试,因为它总是在评估&#34; System .__ ComObject&#34; 。然后当我们尝试在没有实现ShellFolderView
接口的对象上运行CType function时,它会抛出该异常。
我最终偶然发现了this article,这让我尝试了TypeName Function,它似乎返回了实际的类型,所以我最终得到了下面的工作代码:
Public Function GetExplorerSelectedFiles() As String()
Dim ExplorerFiles As New List(Of String)
Dim exShell As New Shell32.Shell
For Each window As SHDocVw.ShellBrowserWindow In DirectCast(exShell.Windows, SHDocVw.IShellWindows)
If TypeName(window.Document) Like "IShellFolderViewDual*" Then
For Each fi As FolderItem In DirectCast(window.Document, ShellFolderView).SelectedItems
ExplorerFiles.Add(fi.Path)
Next
End If
Next
Return ExplorerFiles.ToArray
End Function