Visual Basic Browse/ PIDL / CSIDL Routines
SHBrowseForFolder: Browse Folders Dialog Overview
     
Posted:   Saturday May 17, 1997
Updated:   Monday December 26, 2011
     
Applies to:   VB4-32, VB5, VB6
Developed with:   VB4-32, Windows 95
OS restrictions:   None
Author:   Brad Martinez
     
Related:   BROWSE:
SHBrowseForFolder: Browse Folders Dialog Overview
SHBrowseForFolder: Browse for Folders Dialog
SHBrowseForFolder: Browse for Folders Callback Overview
SHBrowseForFolder: Browse for Folders New UI Features
SHBrowseForFolder: Pre-selecting Folders using a Browse Callback

CSIDL / Folders:
SHGetFolderPath: Overview of Shell and ComCtrl Versions, CSIDL Values
SHGetFolderPath: Retrieve Windows Shell Folders (Best Practice)

SHGetSpecialFolderLocation: Retrieve Windows Shell Folder
SHGetKnownFolderPath: Retrieve Windows Known (Shell) Folders under Vista
Pure VB: Using the Shell Application Object to Retrieve Windows Shell Folders

   
 Prerequisites
None.

The Browse Dialog implementation under the Win32 Shell interface involves several data structures (VB Types) and APIs. This document serves not as an essay on the Shell Interface, but rather of the meaning to each member of the routine and the constants used in the Browse dialog.

Detailed information on the Shell Interface is available on the Microsoft Web Site, and in the Microsoft Developer's Network CD (MSDN).

The following explanation of the components and interaction of the Browse Type and APIs has been provided to VBnet by Brad Martinez.
 Overview
Place the following code into the general declarations area of a bas module:

Option Explicit
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved.
' Some pages may also contain other copyrights by the author.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Distribution: You can freely use this code in your own
'               applications, but you may not reproduce 
'               or publish this code on any web site,
'               online service, or distribute as source 
'               on any media without express permission.
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'The Browse Dialog implementation is made up of
'three C Structures (BROWSEINFO, ITEMIDLIST and SHITEMID), 
'and three APIs (SHBrowseForFolder, SHGetPathFromIDList and
'SHGetSpecialFolderLocation.)

'Objects in the shell’s namespace are assigned item identifiers 
'and item identifier lists. An item identifier uniquely identifies
'an item within its parent folder. An item identifier list 
'uniquely identifies an item within the shell’s namespace by 
'tracing a path to the item from the desktop.
'
'An item identifier is defined by the variable-length SHITEMID
'structure. The first two bytes of this structure specify its 
'size, and the format of the remaining bytes depends on the 
'parent folder, or more precisely, on the software that implements
'the parent folder’s IShellFolder interface. Except for the 
'first two bytes, item identifiers are not strictly defined, 
'and applications should make no assumptions about their format.
Public Type SHITEMID
   cb As Long     'Size of the ID (including cb itself)
   abID As Byte   'The item ID (variable length)
End Type


'The ITEMIDLIST structure defines an element 
'in an item identifier list (the only member of this structure 
'is an SHITEMID structure). An item identifier list consists
'of one or more consecutive ITEMIDLIST structures packed on 
'byte boundaries, followed by a 16-bit zero value. An 
'application can walk a list of item identifiers by examining 
'the size specified in each SHITEMID structure and stopping 
'when it finds a size of zero. A pointer to an item identifier 
'list, is called a PIDL (pronounced piddle.) Note however that
'it is unnecessary to use the ITEMIDLIST structure; since the
'pidl is a long, it can be passed and referenced as such when
'implementing the APIs. The ITEMIDLIST discussion is provided 
'for completeness.     
Public Type ITEMIDLIST
   mkid As SHITEMID
End Type


'SHGetPathFromIDList converts an item
'identifier list to a file system path. It returns 
'TRUE if successful or FALSE if an error occurs, for 
'example, if the location specified by the pidl 
'parameter is not part of the file system.
Public Declare Function SHGetPathFromIDList Lib "shell32" _
     Alias "SHGetPathFromIDListA"_
     (ByVal pidl As Long, ByVal pszPath As String) As Long


'SHGetSpecialFolderLocation retrieves the
'location of a special (system) folder. It returns ERROR_SUCCESS 
'if successful or an OLE-defined error result otherwise.
Public Declare Function SHGetSpecialFolderLocation Lib "shell32"_
  (ByVal hwndOwner As Long, _
   ByVal nFolder As Long, _
   pidl As ITEMIDLIST) As Long

Public Const ERROR_SUCCESS = 0

'The SHGetSpecialFolderLocation "nFolder"
'param holds the value specifying the folder to retrieve the 
'location of. This parameter can be one of the following values. 
'Most folderlocations are stored in 
'HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders.

'Windows desktop virtual folder 
'at the root of the name space
Public Const CSIDL_DESKTOP = &H0

'File system directory that contains the 
'user's program groups (which are also file
'system directories)
Public Const CSIDL_PROGRAMS = &H2

'Control Panel - virtual folder containing 
'icons for the control panel applications 
Public Const CSIDL_CONTROLS = &H3

'Printers folder - virtual folder containing 
'installed printers.
Public Const CSIDL_PRINTERS = &H4

'File system directory that serves as a 
'common repository for documents (Documents folder)
Public Const CSIDL_PERSONAL = &H5

'File system directory that contains the 
'user's Favourite Internet Explorer URLs 
Public Const CSIDL_FAVORITES = &H6

'File system directory that corresponds to the
'user's Startup program group  
Public Const CSIDL_STARTUP = &H7

'File system directory that contains the 
'user's most recently used documents (Recent folder)
Public Const CSIDL_RECENT = &H8

   'File system directory that contains 
   'Send To menu items
Public Const CSIDL_SENDTO = &H9

'Recycle bin file system directory containing file 
'objects in the user's recycle bin. The location of 
'this directory is not in the registry; it is marked 
'with the hidden and system attributes to prevent the
'user from moving or deleting it.
Public Const CSIDL_BITBUCKET = &HA 

'File system directory containing Start menu items
Public Const CSIDL_STARTMENU = &HB

'File system directory used to physically store 
'file objects on the desktop (not to be confused 
'with the desktop folder itself). 
Public Const CSIDL_DESKTOPDIRECTORY = &H10

'My Computer - virtual folder containing everything 
'on the local computer: storage devices, printers, 
'and Control Panel. The folder may also contain 
'mapped network drives.
Public Const CSIDL_DRIVES = &H11

'Network Neighborhood - virtual folder representing 
'the top level of the network hierarchy
Public Const CSIDL_NETWORK = &H12

'File system directory containing objects that 
'appear in the network neighborhood
Public Const CSIDL_NETHOOD = &H13

'Virtual folder containing fonts
Public Const CSIDL_FONTS = &H14
   
'File system directory that serves as a 
'common repository for document templates 
'(ShellNew folder.)
Public Const CSIDL_TEMPLATES = &H15


'A call to the SHBrowseForFolder API displays
'a dialog box that enables the user to select a shell folder. 
'The call returns a pointer to an item identifier list (PIDL) 
'that specifies the location of the selected folder relative 
'to the root of the name space. If the user chooses the Cancel 
'button in the dialog box, the return value is NULL.
Public Declare Function SHBrowseForFolder Lib "shell32" _
    Alias "SHBrowseForFolderA" 
   (lpBrowseInfo As BROWSEINFO) As Long 


'The BROWSEINFO structure contains parameters for the
'SHBrowseForFolder function and receives information 
'about the folder selected by the user. 

Public Type BROWSEINFO
  'Handle of the owner window for the dialog box.      
   hOwner As Long

  'Pointer to an item identifier list (an 
  'ITEMIDLIST structure) specifying the location of 
  'the "root" folder to browse from. Only the 
  'specified folder and its subfolders appear in the dialog box. 
  'This member can be NULL, and in that case, the namespace
  'root (the desktop folder) is used.      
   pidlRoot As Long

  'Pointer to a buffer that receives the display 
  'name of the folder selected by the user. The 
  'size of this buffer is assumed to be MAX_PATH bytes.
   pszDisplayName As String

  'Pointer to a null-terminated string that is 
  'displayed above the tree view control in the 
  'dialog box.This string can be used to specify 
  'instructions to the user.
   lpszTitle As String

  'Value specifying the types of folders to be 
  'listed in the dialog box as well as other options. 
  'This member can include zero or more of 
  'the following values below.  
   ulFlags As Long

  'Address an application-defined function that the 
  'dialog box calls when events occur. For more information, 
  'see the description of the BrowseCallbackProc function. 
  'This member can be NULL. (note: VB4 does not support 
  'callbacks, therefore this member is ignored.)
   lpfn As Long

  'Application-defined value that the dialog box 
  'passes to the callback function (if one is specified).
   lParam As Long

  'Variable that receives the image associated with
  'the selected folder. The image is specified as an 
  'index to the system image list.
   iImage As Long
End Type
                     

'The BROWSEINFO.ulFlags member specifies the type of 
'folders to be listed in the dialog box as well as other options. 
'This member can include zero or more of the following values:
                     
  'Only returns file system directories. If the 
  'user selects folders that are not part of the
  'file system, the OK button is grayed.
   Public Const BIF_RETURNONLYFSDIRS = &H1
  
  'Does not include network folders below the 
  'domain level in the tree view control. 
  'For starting the Find Computer. 
   Public Const BIF_DONTGOBELOWDOMAIN = &H2
  
  'Includes a status area in the dialog box. 
  'The callback function can set the status 
  'text by sending messages to the dialog box.
   Public Const BIF_STATUSTEXT = &H4
  
  'Only returns file system ancestors. If the
  'user selects anything other than a file 
  'system ancestor, the OK button is grayed.
   Public Const BIF_RETURNFSANCESTORS = &H8
  
  'Only returns computers. If the user selects
  'anything other than a computer, the OK 
  'button is grayed.
   Public Const BIF_BROWSEFORCOMPUTER = &H1000
  
   'Only returns (network) printers. If the user
  'selects anything other than a printer, the 
  'OK button is grayed.
   Public Const BIF_BROWSEFORPRINTER = &H2000
 Comments
For instructions on using SHBrowseForFolder, PIDLs, and CSLIDs, see the following topics:

BROWSE:
SHBrowseForFolder: Browse Folders Dialog Overview
SHBrowseForFolder: Browse for Folders Dialog
SHBrowseForFolder: Browse for Folders Callback Overview
SHBrowseForFolder: Browse for Folders New UI Features
SHBrowseForFolder: Pre-selecting Folders using a Browse Callback

CSIDL / Folders:
SHGetFolderPath: Overview of Shell and ComCtrl Versions, CSIDL Values
SHGetFolderPath: Retrieve Windows Shell Folders (Best Practice)


 
 

PayPal Link
Make payments with PayPal - it's fast, free and secure!

 
 
 
 

Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved.
Terms of Use  |  Your Privacy

 

Hit Counter