Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" (ByVal pidl As Long, ByVal pszPath As String) As Long
SHGetPathFromIDList determines the path of the folder refered to by a pointer to an ITEMIDLIST structure (a.k.a. a PIDL). The function only works if the PIDL refers to a physical directory on the system; it cannot get the name of a virtual folder.
If an error occured or the PIDL refers to a virtual folder, the function returns 0. If successful, the function returns a non-zero value.
None.
' This code is licensed according to the terms and conditions listed here.
' Open the Browse for Folder dialog box and display both the display name and
' the actual name of the folder (if it is not a virtual folder). Any folder under My Computer
' may be selected.
Dim bi As BROWSEINFO ' structure passed to the function
Dim pidl As Long ' PIDL to the user's selection
Dim physpath As String ' string used to temporarily hold the physical path
Dim retval As Long ' return value
' Initialize the structure to be passed to the function.
bi.hwndOwner = Form1.hWnd ' window Form1 is the owner of the dialog box
' Specify the My Computer virtual folder as the root
retval = SHGetSpecialFolderLocation(Form1.hWnd, CSIDL_DRIVES, bi.pidlRoot)
' Make room in the buffer to get the [virtual] folder's display name
bi.pszDisplayName = Space(260)
bi.lpszTitle = "Please choose a folder." ' Message displayed to the user
bi.ulFlags = 0 ' no flags are needed here
bi.lpfn = 0 ' no callback function is being used
bi.lParam = 0 ' not needed
bi.iImage = 0 ' this will be set by the function
' Open the Browse for Folder dialog box.
pidl = SHBrowseForFolder(bi)
' If the user selected something, display its display name
' and its physical location on the system.
If pidl <> 0 Then
' Remove the empty space from the display name variable.
bi.pszDisplayName = Left(bi.pszDisplayName, InStr(bi.pszDisplayName, vbNullChar) - 1)
Debug.Print "The user selected: "; bi.pszDisplayName
' If the folder is not a virtual folder, display its physical location.
physpath = Space(260) ' make room in the buffer
retval = SHGetPathFromIDList(pidl, physpath)
If retval = 0 Then
Debug.Print "Physical Location: (virtual folder)"
Else
' Remove the empty space and display the result.
physpath = Left(physpath, InStr(physpath, vbNullChar) - 1)
Debug.Print "Physical Location: "; physpath
End If
' Free the pidl returned by the function.
CoTaskMemFree pidl
End If
' Whether successful or not, free the PIDL which was used to
' identify the My Computer virtual folder.
CoTaskMemFree bi.pidlRoot
Go back to the alphabetical Function listing.
Go back to the Reference section index.
Last Modified: September 25, 1999
This page is copyright © 1999 Paul Kuliniewicz.
Copyright Information Revised October 29, 2000
Go back to the Windows API Guide home page.
E-mail: vbapi@vbapi.com Send Encrypted E-Mail
This page is at http://www.vbapi.com/ref/s/shgetpathfromidlist.html