3

rootFolder 引数に任意のパスを渡す必要があるため、VB.NET で Shell.BrowseForFolder を呼び出しています。したがって、次のようにオブジェクトをインスタンス化します。

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})

できます!

反射

しかし、私にとっては、2 つの呼び出し (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 に答える