Declare Function SHGetPathFromIDList Lib "shell32" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
SHGetPathFromIDList определяет путь папки, заданной указателем структуры ITEMIDLIST(PIDL). Функция работает только с физическими папками. С виртуальными папками функция не работает
В случае ошибки или, если PIDL ссылается на виртуальную папку, функция возвращает 0. В успешном случае функция возвращает ненулевое значение
' Откроем диалоговое окно Обзор папок ' и покажем полное имя папки Dim bi As BROWSEINFO ' структура для использовия функцией Dim pidl As Long ' PIDL Dim physpath As String ' физический путь папки Dim retval As Long ' возвращаемое значение ' Инициализируем структуру bi.hwndOwner = Form1.hWnd ' Определяем виртуальную папку Мой компьютер ' вершиной списка retval = SHGetSpecialFolderLocation(Form1.hWnd, CSIDL_DRIVES, bi.pidlRoot) ' Создаем место в буфере для получения имени папки bi.pszDisplayName = Space(260) bi.lpszTitle = "Выберите папку" bi.ulFlags = 0 bi.lpfn = 0 bi.lParam = 0 bi.iImage = 0 ' Откроем диалоговое окно Обзор папок pidl = SHBrowseForFolder(bi) ' Если пользователь что-то выбрал, ' то показываем путь If pidl <> 0 Then bi.pszDisplayName = Left(bi.pszDisplayName, InStr(bi.pszDisplayName, vbNullChar) - 1) Debug.Print "Вы выбрали: "; bi.pszDisplayName ' Если папка не явлеятся виртуальной, ' то показываем его путь physpath = Space(260) retval = SHGetPathFromIDList(pidl, physpath) If retval = 0 Then Debug.Print "Путь к папке: (виртуальная)" Else physpath = Left(physpath, InStr(physpath, vbNullChar) - 1) Debug.Print "Путь к папке: "; physpath End If ' Освобождаем pidl CoTaskMemFree pidl End If CoTaskMemFree bi.pidlRoot