3

我在 VB.NET 中调用 Shell.BrowseForFolder,因为我需要在 rootFolder 参数中传递任意路径。所以我实例化了一个这样的对象:

Dim shellType As Type = Type.GetTypeFromProgID("Shell.Application")
Dim shell = Activator.CreateInstance(shellType)

然后我打电话:

Dim folder = shell.BrowseForFolder(0, message, &H241, rootFolder)

它没有按预期工作(未使用根文件夹 F:)

直接呼叫

但是,如果我使用具有相同参数的反射:

Dim folder = shellType.InvokeMember("BrowseForFolder", _
  BindingFlags.InvokeMethod, Nothing, shell, New Object() {0, message, &H241, _
  rootFolder})

有用!

反射

但对我来说,两个调用(InvokeMember 和直接调用)应该产生相似的结果(参数相同)。发生了什么?

编辑:

事实上,如果我调用 ToString() 或者如果我放一个小字,它会起作用:

Dim folder = shell.BrowseForFolder(0, message, &H241, rootFolder.ToString())

或者

Dim folder = shell.BrowseForFolder(0, message, &H241, "F:")

但如果 rootFolder 是一个参数,它就不起作用,例如:

Function BrowseForFolder(ByVal message As String, ByVal rootFolder As String) As String
    Dim shellType As Type = Type.GetTypeFromProgID("Shell.Application")
    Dim shell = Activator.CreateInstance(shellType)
    Dim folder = shell.BrowseForFolder(0, message, &H241, rootFolder)
    If folder Is Nothing Then
        Return ""
    End If
    Return folder.Self.Path
End Function
4

2 回答 2

2

我在带有 vs 2012 的 Windows 7 64 位下重现此问题的唯一方法是rootFolder在该变量中设置一个无效字符串,如空字符串或废话数据。

你能在那行做一个断点吗:

   Dim folder = shell.BrowseForFolder(0, message, &H241, rootFolder)

并检查是什么rootFolder

找到一种方法试试这个;

  Dim folder = shell.BrowseForFolder(0, message, &H241, rootFolder.ToString())

我的代码:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim rootFolder As Object = "f:"
    Dim shellType As Type = Type.GetTypeFromProgID("Shell.Application")
    Dim shell = Activator.CreateInstance(shellType)
    Dim folder = shell.BrowseForFolder(0, "message", &H241, rootFolder.ToString())
End Sub
于 2013-07-10T12:26:57.520 回答
1

您总是可以直接使用 folderBrowserDialog :

Dim f As New FolderBrowserDialog
f.SelectedPath = "f:"
f.ShowDialog()

虽然我看不到如何让它显示 F:

于 2013-07-10T13:01:14.917 回答