2013-07-10 2 views
3

Я вызываю Shell.BrowseForFolder в VB.NET, потому что мне нужно передать произвольный путь в аргументе rootFolder. Поэтому я создании экземпляра в Objet так:InvokeMember дает отличный результат, чем прямой вызов

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

Тогда я вызываю:

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

Это не работает, как ожидалось (корневая папка F: не используется)

Direct call

Но если я использую отражение с теми же аргументами:

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

Это работает!

Reflection

Но для меня 2 звонки (InvokeMember и прямой вызов) должны давать одинаковые результаты (аргументы идентичны). Что происходит?

Edit:

На самом деле, это работает, если я называю ToString(), или если я положил litteral:

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 

ответ

2

только для меня, чтобы воспроизвести эту проблему под Windows 7 64 бит с vs 2012, должен иметь недопустимый 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 
+0

Согласен, не может быть воспроизведен здесь или на vs2010., Той же ОС. – RobS

+0

Я работаю с VS 2010 на 64-разрядной ОС Windows 7. rootFolder - это строка, инициализированная «F:». Этот диск существует на моем компьютере. – Maxence

+0

@Maxence, я думаю, я нашел, как исправить это, я смог воспроизвести проблему – Fredou

1

Вы всегда можете использовать FolderBrowserDialog непосредственно:

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

Хотя я не могу видеть, как получить его только шоу F:

+0

Я использую Shell.BrowseForFolder, потому что FolderBrowserDialog принимает только SpecialFolder в свой ресурс RootFolder. – Maxence

+0

Несомненно, это, в конце концов, странное ограничение. – RobS

Смежные вопросы