Функция SHGetFolderLocation

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 для освобождения памяти

Возвращаемое значение

Функция возвращает один из следующих флажков:

S_OK
Функция завершилась успешно
S_FALSE
CSIDL специальной папки существует. Папка является виртуальной
E_INVALIDARG
CSIDL не доступен

Параметры

hwndOwner
Дескриптор окна, вызывающей функцию
nFolder
CSIDL специальной папки для получения PIDL
hToken
Идентификатор пользователя. Обычно равен 0, но может иметь другие значения для дополнительной безопасности
dwReserved
Зарезервировано - установлен в 0
ppidl
PIDL специальной папки

Пример

' Откром диалоговое окно
' Обзор папок и выведем имя папки
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

Смотри также

SHGetFolderPath, SHGetSpecialFolderLocation

Категория

Оболочка