Hi,
我想从一个弹出的窗口中选择一个目录,在vb中如何实现这一"浏览文件夹"的功能?
谢谢

解决方案 »

  1.   

    Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias _
            "SHBrowseForFolderA" (lpBrowseInfo As BROWSEINFO) As LongPrivate Declare Function SHGetSpecialFolderLocation Lib _
            "shell32.dll" (ByVal hwndOwner As Long, ByVal nFolder _
            As Long, pIdl As ITEMIDLIST) As LongPrivate Declare Function SHGetFileInfo Lib "Shell32" Alias _
            "SHGetFileInfoA" (ByVal pszPath As Any, ByVal _
            dwFileAttributes As Long, psfi As SHFILEINFO, ByVal _
            cbFileInfo As Long, ByVal uFlags As Long) As LongPrivate Declare Function ShellAbout Lib "shell32.dll" Alias _
            "ShellAboutA" (ByVal hwnd As Long, ByVal szApp As _
            String, ByVal szOtherStuff As String, ByVal hIcon As Long) _
            As Long
    Private Declare Function SHGetPathFromIDList Lib "shell32.dll" _
            Alias "SHGetPathFromIDListA" (ByVal pIdl As Long, ByVal _
            pszPath As String) As Long
    Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal pv As Long)Const MAX_PATH = 260Private Type SHITEMID
        cb As Long
        abID() As Byte
    End TypePrivate Type ITEMIDLIST
        mkid As SHITEMID
    End TypePrivate Type BROWSEINFO
        hOwner As Long
        pidlRoot As Long
        pszDisplayName As String
        lpszTitle As String
        ulFlags As Long
        lpfn As Long
        lParam As Long
        iImage As Long
    End TypePrivate Type SHFILEINFO
        hIcon As Long
        iIcon As Long
        dwAttributes As Long
        szDisplayName As String * MAX_PATH
        szTypeName As String * 80
    End Type
    Private Function GetFolderValue(wIdx As Integer) As Long
        If wIdx < 2 Then
            GetFolderValue = 0
        ElseIf wIdx < 12 Then
            GetFolderValue = wIdx
        Else
            GetFolderValue = wIdx + 4
        End If
    End FunctionPrivate Sub Command1_Click()
      Dim BI As BROWSEINFO
      Dim nFolder As Long
      Dim IDL As ITEMIDLIST
      Dim pIdl As Long
      Dim sPath As String
      Dim SHFI As SHFILEINFO
      Dim m_wCurOptIdx As Integer
      Dim txtPath As String
      Dim txtDisplayName As String
      
      With BI
        .hOwner = Me.hwnd
        nFolder = GetFolderValue(m_wCurOptIdx)
        
        If SHGetSpecialFolderLocation(ByVal Me.hwnd, ByVal nFolder, IDL) = NOERROR Then
          .pidlRoot = IDL.mkid.cb
        End If
        
        .pszDisplayName = String$(MAX_PATH, 0)
        .lpszTitle = "Browsing is limited to: "
        .ulFlags = 0
      End With
      
      txtPath = ""
      txtDisplayName = ""
      
      pIdl = SHBrowseForFolder(BI)
      
      If pIdl = 0 Then Exit Sub
      sPath = String$(MAX_PATH, 0)
      SHGetPathFromIDList ByVal pIdl, ByVal sPath  txtPath = Left(sPath, InStr(sPath, vbNullChar) - 1)
      txtDisplayName = Left$(BI.pszDisplayName, _
                        InStr(BI.pszDisplayName, vbNullChar) - 1)
      
      SHGetFileInfo ByVal pIdl, 0&, SHFI, Len(SHFI), _
                    SHGFI_PIDL Or SHGFI_ICON Or SHGFI_SMALLICON
      
      SHGetFileInfo ByVal pIdl, 0&, SHFI, Len(SHFI), _
                    SHGFI_PIDL Or SHGFI_ICON
      CoTaskMemFree pIdl
      MsgBox "你选择的文件夹是" + Chr(13) + Chr(10) + txtPath
    End Sub
      

  2.   

    谢谢,

        If SHGetSpecialFolderLocation(ByVal Me.hwnd, ByVal nFolder, IDL) = NOERROR Then
          .pidlRoot = IDL.mkid.cb
        End If中的NOERROR的值是多少?