Al final, buscando, buscando encontré MSDN (sección Development Platform) una referencia a la función SHGetFolderPath, que he traducido así:
Declare Function SHGetFolderPath _
Lib "SHFolder.DLL" _
Alias "SHGetFolderPathA" (ByVal hwndOwner As Long, _
ByVal nFolder As Integer, _
ByVal hToken As Long, _
ByVal dwFlags As Long, _
ByVal pszPath As String) As Long
y se la llama así:
Dim strDir As String
Dim lngResult As Long
strDir = Space(260)
lngResult = SHGetFolderPath(0&, nFolder , 0&, dwFlags, strDir)
If lngResult = 0 Then
' ben
strDir = Left$(strDir, InStr(strDir, Chr$(0)) - 1)
Else
strDir = ""
End If
dwFlags tiene 2 valores posibles:
'dwFlags
Public Const SHGFP_TYPE_CURRENT = 0 ' // current value for user,
verify it exists
Public Const SHGFP_TYPE_DEFAULT = 1 ' // default value, may not
exist
nFolder es enumerado, y puede tomar alguno de los siguiente:
' Constantes para el argumento nFolder
' (Usar valores en arcDirectorio para llamar a ARCGetShellFolder)
'
Public Const CSIDL_DESKTOP = &H0 ' //
Public Const CSIDL_INTERNET = &H1 ' // Internet Explorer (icon on desktop)
Public Const CSIDL_PROGRAMS = &H2 ' // Start Menu\Programs
Public Const CSIDL_CONTROLS = &H3 ' // My Computer\Control Panel
Public Const CSIDL_PRINTERS = &H4 ' // My Computer\Printers
Public Const CSIDL_PERSONAL = &H5 ' // My Documents
Public Const CSIDL_FAVORITES = &H6 ' // \Favorites
Public Const CSIDL_STARTUP = &H7 ' // Start Menu\Programs\Startup
Public Const CSIDL_RECENT = &H8 ' // \Recent
Public Const CSIDL_SENDTO = &H9 ' // \SendTo
Public Const CSIDL_BITBUCKET = &HA ' // \Recycle Bin
Public Const CSIDL_STARTMENU = &HB ' // \Start Menu
Public Const CSIDL_DESKTOPDIRECTORY = &H10 ' // name>\Desktop
Public Const CSIDL_DRIVES = &H11 ' // My Computer
Public Const CSIDL_NETWORK = &H12 ' // Network Neighborhood
Public Const CSIDL_NETHOOD = &H13 ' // \nethood
Public Const CSIDL_FONTS = &H14 ' // windows\fonts
Public Const CSIDL_TEMPLATES = &H15
Public Const CSIDL_COMMON_STARTMENU = &H16 ' // All Users\Start Menu
Public Const CSIDL_COMMON_PROGRAMS = &H17 ' // All Users\Programs
Public Const CSIDL_COMMON_STARTUP = &H18 ' // All Users\Startup
Public Const CSIDL_COMMON_DESKTOPDIRECTORY = &H19 ' // All Users\Desktop
Public Const CSIDL_APPDATA = &H1A ' // name>\Application Data
Public Const CSIDL_PRINTHOOD = &H1B ' // name>\PrintHood
Public Const CSIDL_LOCAL_APPDATA = &H1C ' // name>\Local Settings\Applicaiton Data (non roaming)
Public Const CSIDL_ALTSTARTUP = &H1D ' // non localized startup
Public Const CSIDL_COMMON_ALTSTARTUP = &H1E ' // non localized common startup
Public Const CSIDL_COMMON_FAVORITES = &H1F
Public Const CSIDL_INTERNET_CACHE = &H20
Public Const CSIDL_COOKIES = &H21
Public Const CSIDL_HISTORY = &H22
Public Const CSIDL_COMMON_APPDATA = &H23 ' // All Users\Application Data
Public Const CSIDL_WINDOWS = &H24 ' // GetWindowsDirectory()
Public Const CSIDL_SYSTEM = &H25 ' // GetSystemDirectory()
Public Const CSIDL_PROGRAM_FILES = &H26 ' // C:\Program Files
Public Const CSIDL_MYPICTURES = &H27 ' // C:\Program Files\My Pictures
Public Const CSIDL_PROFILE = &H28 ' // USERPROFILE
Public Const CSIDL_SYSTEMX86 = &H29 ' // x86 system directory on RISC
Public Const CSIDL_PROGRAM_FILESX86 = &H2A ' // x86 C:\Program Files on RISC
Public Const CSIDL_PROGRAM_FILES_COMMON = &H2B ' // C:\Program Files\Common
Public Const CSIDL_PROGRAM_FILES_COMMONX86 = &H2C ' // x86 Program Files\Common on RISC
Public Const CSIDL_COMMON_TEMPLATES = &H2D ' // All Users\Templates
Public Const CSIDL_COMMON_DOCUMENTS = &H2E ' // All Users\Documents
Public Const CSIDL_COMMON_ADMINTOOLS = &H2F ' // All Users\Start Menu\Programs\Administrative Tools
Public Const CSIDL_ADMINTOOLS = &H30 ' // \Start Menu\Programs\Administrative Tools
' nFolder (otros. Para sumar)
Public Const CSIDL_FLAG_CREATE = &H8000 ' // combine with CSIDL_ value to force create on SHGetSpecialFolderLocation()
Public Const CSIDL_FLAG_DONT_VERIFY = &H4000 ' // combine with CSIDL_ value to force create on SHGetSpecialFolderLocation()
Public Const CSIDL_FLAG_MASK = &HFF00 ' // mask for all possible flag values
Un ejemplo:
SHGetFolderPath(0&, CSIDL_PERSONAL + CSIDL_FLAG_CREATE, 0&, dwFlags, SHGFP_TYPE_CURRENT)
Podría devolver "C:\Mis documentos" y además, si el directorio todavía no existe, él se encarga de crearlo.
Una nota:
La librería SHFolder.DLL que proporciona esta función solo existe en Windows2000, o en Win95/98/NT4 con Internet Explorer 4.0 o superior.
---------------------------------------------------------------------
Alberto Rodríguez Calvo (cittarc@usc.es)
Centro de Innovación e Transferencia de Tecnoloxia (CITT)
Universidade de Santiago de Compostela
Páxina Web do CITT: http://www.usc.es/citt
Avda. Ciencias s/n, Campus Sur Tfno (9)81 599800
15706 Santiago de Compostela (A Coruña) (9)81 563100 Ext 14380
España Fax (9)81 599309
---------------------------------------------------------------------