Declare Function SHGetFolderLocation Lib "shell32" Alias "SHGetFolderLocationA" (ByVal hwndOwner As Long, ByVal nFolder As Long, ByVal hToken As Long, ByVal dwReserved As Long, ppidl As Long) As Long
SHGetFolderLocation создает указатель к структуре ITEMIDLIST (известную как PIDL)), ссылающую к специальной папке на компьютере. PIDL может относиться к специальным папкам, которые существуют на диске или являются виртуальными папками. После завершения вашей программы, использующей PIDL, используйте CoTaskMemFree для освобождения памяти
Функция возвращает один из следующих флажков:
' Откром диалоговое окно ' Обзор папок и выведем имя папки Dim bi As BROWSEINFO ' структура для функции Dim pidl As Long Dim physpath As String ' строка, используемая для хранения физического пути Dim retval As Long ' возвращаемое значение bi.hwndOwner = Form1.hWnd ' Определяем папку Mой компьютер retval = SHGetFolderLocation(Form1.hWnd, CSIDL_DRIVES, 0, 0, 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 "Физический путь: (виртуальной папки)"; physpath Else physpath = Left(physpath, InStr(physpath, vbNullChar) - 1) Debug.Print "Физический путь: "; physpath End If ' Освобождаем память, используемой pidl CoTaskMemFree pidl End If CoTaskMemFree bi.pidlRoot