Yes, you can use some APIs to create a BrowseForFolder dialog.
VB Code:
  1. Private Type BrowseInfo
  2.     hWndOwner As Long
  3.     pIDLRoot As Long
  4.     pszDisplayName As Long
  5.     lpszTitle As Long
  6.     ulFlags As Long
  7.     lpfnCallback As Long
  8.     lParam As Long
  9.     iImage As Long
  10. End Type
  11. Const BIF_RETURNONLYFSDIRS = 1
  12. Const MAX_PATH = 260
  13. Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
  14. Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
  15. Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
  16. Private Declare Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long
  17. Private Sub Form_Load()
  18.     'KPD-Team 1998
  19.     'URL: [url]http://www.allapi.net/[/url]
  20.     Dim iNull As Integer, lpIDList As Long, lResult As Long
  21.     Dim sPath As String, udtBI As BrowseInfo
  22.  
  23.     With udtBI
  24.         'Set the owner window
  25.         .hWndOwner = Me.hWnd
  26.         'lstrcat appends the two strings and returns the memory address
  27.         .lpszTitle = lstrcat("C:\", "")
  28.         'Return only if the user selected a directory
  29.         .ulFlags = BIF_RETURNONLYFSDIRS
  30.     End With
  31.  
  32.     'Show the 'Browse for folder' dialog
  33.     lpIDList = SHBrowseForFolder(udtBI)
  34.     If lpIDList Then
  35.         sPath = String$(MAX_PATH, 0)
  36.         'Get the path from the IDList
  37.         SHGetPathFromIDList lpIDList, sPath
  38.         'free the block of memory
  39.         CoTaskMemFree lpIDList
  40.         iNull = InStr(sPath, vbNullChar)
  41.         If iNull Then
  42.             sPath = Left$(sPath, iNull - 1)
  43.         End If
  44.     End If
  45.  
  46.     MsgBox sPath
  47. End Sub