2013-07-10 60 views
3

我在VB.NET中調用Shell.BrowseForFolder,因爲我需要在rootFolder參數中傳遞任意路徑。所以,我實例化一個像這樣的客體: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和直接調用)應該產生類似的結果(參數是相同的)。發生了什麼?

編輯:

事實上,它的工作原理,如果我調用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

我在Windows 7 64位操作系統上使用VS 2010。 rootFolder是一個用「F:」初始化的字符串。該磁盤存在於我的電腦上。 – Maxence

+0

@Maxence,我想我找到了解決方法,我能夠重現問題 – Fredou

1

你總是可以直接使用的FolderBrowserDialog:

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

雖然我不能看到如何得到它顯示F:

+0

我正在使用Shell.BrowseForFolder,因爲FolderBrowserDialog只在他的RootFolder屬性中使用SpecialFolder。 – Maxence

+0

當然 - 畢竟,這是一個奇怪的限制。 – RobS

相關問題