Добрый день
Столкнулся с проблемой выбора каталога из произвольного корня. Использовал API функцию SHBrowseForFolder и SHSimpleIDListFromPath
Private Function BrowseFolder(szDlgTitle As String, _
Optional strRootFldr As String = "") As String
Dim X As Long
Dim bi As BROWSEINFO
Dim dwIList As Long
Dim szPath As String
Dim lngFldrId As Long
If strRootFldr > "" Then
lngFldrId = SHSimpleIDListFromPath(strRootFldr) 'Не работает!!!
End If
With bi
.hwndOwner = hWndAccessApp
.lpszTitle = szDlgTitle
.ulFlags = BIF_RETURNONLYFSDIRS
.pidlRoot = lngFldrId
End With
dwIList = SHBrowseForFolder(bi)
szPath = Space$(MAX_PATH)
X = SHGetPathFromIDList(ByVal dwIList, ByVal szPath)
BrowseFolder = Trim$(szPath)
End Function
SHSimpleIDListFromPath адекватно не работает, в чем проблема и есть ли ее аналог?
Заранее благодарен.
Здравствуйте, <Аноним>, Вы писали:
А>Добрый день
А>Столкнулся с проблемой выбора каталога из произвольного корня. Использовал API функцию SHBrowseForFolder и SHSimpleIDListFromPath
А>SHSimpleIDListFromPath адекватно не работает, в чем проблема и есть ли ее аналог?
А>Заранее благодарен.
Есть более простой способ. Для начала необходимо подключить к проекту Shell32.dll. Затем код (выдран из модуля, поэтому несамодостаточен=))):
Private Const BIF_RETURNONLYFSDIRS& = &H1 'выбор только объектов файловой системы
Private Const BIF_EDITBOX& = &H10 'текстовое поле
Private Const BIF_VALIDATE& = &H20 'проверка строки текстового поля
Private Const BIF_NEWDIALOGSTYLE& = &H40 'модерновый дизайн
Private Const BIF_RETURNFSANCESTORS& = &H8 'хз
Public Sub ShowFolder()
Dim oShell As Shell
Dim oFolder As Folder
Dim oFolderItem As FolderItem
Set oShell = New Shell
Set oFolder = oShell.BrowseForFolder(mhOwner, mDialogTitle, mFlags, mInitDir)
If IsNull(oFolder) And mCancelError Then
Call Err.Raise(vbObjectError + 1)
Else
Set oFolderItem = oFolder.Items.Item
mFileName = oFolderItem.Path
Set oFolderItem = Nothing
End If
Set oFolder = Nothing
Set oShell = Nothing
End Sub
Где mhOwner — hWnd родителя (может быть 0); mDialogTitle — заголовок диалога; mFlags — см. константы; mInitDir — директория -- может быть как строкой, так и числовой константой (см. ниже); mFileName — содержит путь к выбранной директории.
А вот и константы для директорий, думаю, понятно, что к чему:
enum ShellSpecialFolderConstants
{ ssfDESKTOP = 0,
ssfPROGRAMS = 0x2,
ssfCONTROLS = 0x3,
ssfPRINTERS = 0x4,
ssfPERSONAL = 0x5,
ssfFAVORITES = 0x6,
ssfSTARTUP = 0x7,
ssfRECENT = 0x8,
ssfSENDTO = 0x9,
ssfBITBUCKET = 0xa,
ssfSTARTMENU = 0xb,
ssfDESKTOPDIRECTORY = 0x10,
ssfDRIVES = 0x11,
ssfNETWORK = 0x12,
ssfNETHOOD = 0x13,
ssfFONTS = 0x14,
ssfTEMPLATES = 0x15,
ssfCOMMONSTARTMENU = 0x16,
ssfCOMMONPROGRAMS = 0x17,
ssfCOMMONSTARTUP = 0x18,
ssfCOMMONDESKTOPDIR = 0x19,
ssfAPPDATA = 0x1a,
ssfPRINTHOOD = 0x1b,
ssfLOCALAPPDATA = 0x1c,
ssfALTSTARTUP = 0x1d,
ssfCOMMONALTSTARTUP = 0x1e,
ssfCOMMONFAVORITES = 0x1f,
ssfINTERNETCACHE = 0x20,
ssfCOOKIES = 0x21,
ssfHISTORY = 0x22,
ssfCOMMONAPPDATA = 0x23,
ssfWINDOWS = 0x24,
ssfSYSTEM = 0x25,
ssfPROGRAMFILES = 0x26,
ssfMYPICTURES = 0x27,
ssfPROFILE = 0x28,
} ShellSpecialFolderConstants;
... << RSDN@Home 1.1 beta 1 >>
Здравствуйте, vitOS_base.
Спасибо за ответ.
Однако у данного решения есть небольшой недостаток:
В параметрах метода Shell.BrowseForFolder отсутсвует возможность задать
начальный путь (Корень\Папка1\Папка2)
Возможно все же существует реализация через API ?