ShellBrowserWindow对象到ShellFolderView对象

时间:2015-06-24 18:53:24

标签: vb.net visual-studio-2013 windows-shell

寻找帮助,试图弄清楚为什么这种类型转换不能在我的机器上运行 此代码是answer提供给我的另一个问题而且它不适用于我。它适用于他们机器上的答案海报,但我在尝试从ShellBrowserWindowShellFolderView进行类型转换的行上有例外。

我正在使用 Visual Studio Express 2013 ,在 Windows 7 Pro X64 Sp1 上运行。该项目的目标框架是.Net Framework 4。我已添加对Microsoft Internet ControlsMicrosoft Shell Controls and Automation的引用,并且我已为ImportsShell32添加了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对象上的快速监视器显示错误,指出它未定义或无法访问。

Quickwatch on "window" object Quickwatch on "window.document"

我运行了查询Microsoft.VisualBasic.Information.TypeName(window.document)并返回&#34; IShellFolderViewDual3&#34;。

1 个答案:

答案 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