Carlos, mira si te sirve esta función publicada en el Blog de este grupo, y que he ampliado con 2 nuevas carpetas:
Function specialfolders
*==============================================================================
* Objetivo: Determinar la ruta a las carpetas especiales especificadas
* Autor: Doug Hennig
* Última revisión: 01/24/2007
* Parámetros: tuFolder - la carpeta a la que se quiere obtener la ruta.
* Especifica el valor CSIDL para la carpeta deseada
* (la que podemos obtener desde:
*
http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/enums/csidl.asp * o emplea una de las siguientes cadenas:
* "AppData": datos específicos de la aplicación
* "CommonAppDataº": datos de la aplicación para todos los usuarios
* "Desktop": Escritorio del usuario
* "LocalAppData": datos para aplicaciones locales (que no se desplazan)
* "Personal": carpeta Mis Documentos
* "CommonStartup": carpeta de inicio de programas para todos usuarios
* "Startup": carpeta de inicio de programas para el usuario
* Devuelve: La ruta para la carpeta especificada o blanco
* si no encuentra la carpeta
* Entorno de entrada: Ninguno
* Entorno de salida: Error 11 ocurre si tuFolder no ha sido especificado correctamente
* Notas: Este código ha sido adaptado desde:
*
http://msdn2.microsoft.com/en-us/library/aa140088(office.10).aspx * Es posible agregar fácilmente soporte para otros CSIDLs
*==============================================================================
Lparameters tuFolder
Local lcPath, ;
lnFolder, ;
lcFolder, ;
lnPidl, ;
lnPidlFound, ;
lnFolderFound
* Define los valores CSIDLs para las diferentes carpetas.
#Define CSIDL_APPDATA 0x1A
* Datos específicos de la aplicación:
* XP: C:\Documents and Settings\username\Application Data
* Vista: C:\Users\username\AppData\Roaming
#Define CSIDL_COMMON_APPDATA 0x23
* Datos de la aplicación para todos los usuarios:
* XP: C:\Documents and Settings\All Users\Application Data
* Vista: C:\ProgramData
#Define CSIDL_DESKTOPDIRECTORY 0x10
* Escritorio del usuario:
* XP: C:\Documents and Settings\username\Desktop
* Vista: C:\Users\username\Desktop
#Define CSIDL_LOCAL_APPDATA 0x1C
* datos para aplicaciones locales (que no se desplazan):
* XP: C:\Documents and Settings\username\Local Settings\Application Data
* Vista: C:\Users\username\AppData\Local
#Define CSIDL_PERSONAL 0x05
* Carpeta Mis Documentos:
* XP: C:\Documents and Settings\username\My Documents
* Vista: C:\Users\username\Documents
#Define CSIDL_COMMON_STARTUP 0x18
* Carpeta Inicio del usuario:
* XP: C:\Documents and Settings\username\My Documents
* Vista: C:\Users\username\Documents
#Define CSIDL_STARTUP 0x07
* Carpeta Inicio del usuario:
* XP: C:\Documents and Settings\username\My Documents
* Vista: C:\Users\username\Documents
* Definir algunas otras constantes.
#Define ERR_ARGUMENT_INVALID 11
#Define MAX_PATH 260
#Define NOERROR 0
#Define SUCCESS 1
* Comprobar los parámetros.
Do Case
* Si es numérico, asume que es un valor CSIDL válido;
* si no, la función API devuelve una cadena vacía
Case Vartype(tuFolder) = 'N'
lnFolder = tuFolder
* Se ha pasado un tipo de dato no válido o una carpeta vacía
Case Vartype(tuFolder) <> 'C' Or Empty(tuFolder)
Error ERR_ARGUMENT_INVALID
Return ''
* Si se ha pasado una cadena, lo convierte en el valor CSIDL adecuado.
Otherwise
lcFolder = Upper(tuFolder)
Do Case
Case lcFolder = 'APPDATA'
lnFolder = CSIDL_APPDATA
Case lcFolder = 'COMMONAPPDATA'
lnFolder = CSIDL_COMMON_APPDATA
Case lcFolder = 'DESKTOP'
lnFolder = CSIDL_DESKTOPDIRECTORY
Case lcFolder = 'LOCALAPPDATA'
lnFolder = CSIDL_LOCAL_APPDATA
Case lcFolder = 'PERSONAL'
lnFolder = CSIDL_PERSONAL
Case lcFolder = 'COMMONSTARTUP'
lnFolder = CSIDL_COMMON_STARTUP
Case lcFolder = 'STARTUP'
lnFolder = CSIDL_STARTUP
Otherwise
Error ERR_ARGUMENT_INVALID
Return ''
Endcase
Endcase
* Declara las funciones API que necesitamos.
Declare Long SHGetSpecialFolderLocation In shell32 Long HWnd, Long nFolder, ;
long @ ppidl
Declare Long SHGetPathFromIDList In shell32 Long Pidl, String @ pszPath
Declare CoTaskMemFree In ole32 Long pvoid
* Inicia las variables que actualizará la función API.
lcPath = Space(MAX_PATH)
lnPidl = 0
* Obtiene la ruta para las carpetas especificadas.
lnPidlFound = SHGetSpecialFolderLocation(0, lnFolder, @lnPidl)
If lnPidlFound = NOERROR
lnFolderFound = SHGetPathFromIDList(lnPidl, @lcPath)
If lnFolderFound = SUCCESS
lcPath = Left(lcPath, At(Chr(0), lcPath) - 1)
Endif lnFolderFound = SUCCESS
Endif lnPidlFound = NOERROR
CoTaskMemFree(lnPidl)
lcPath = Alltrim(lcPath)
Return lcPath
Endfunc
Espero que te sirva.
Un saludo.