Obtener el camino de las carpetas de sistema

Para añadir un elemento al escritorio de Windows, al menú Programas o a la carpeta de Inicio, no hay mas que crear el archivo o acceso directo usando el camino apropiado. Este camino, sin embargo, cambia de una versión a otra de Windows, así como de una lengua a otra.

El registro de Windows dispone de una serie de entradas que permiten recuperar los caminos de todas las carpetas de sistema, pero si no queremos tocar este elemento del sistema, en su lugar podemos usar la función SHGetSpecialFolder. Al llamarla hay que pasar cuatro parámetros:

– Un HWND con el identificador de la ventana que hace la llamada a la función.
– Un puntero a un espacio, con al menos MAX_PATH caracteres, en el que se devolverá la unidad y camino de la carpeta solicitada.
– Una constante indicando la carpeta cuyo camino se desea recuperar. En la tabla de más abajo se indican algunas de estas constantes.
– Un valor Boolean mediante el cual es posible indicar si la carpeta debe ser creada en caso de no existir.

Constantes que identifican las carpetas de sistema

Elemento Constante Valor
Escritorio CSIDL_DESKTOP 0
Menú Programas CSIDL_PROGRAMS 2
Menú Inicio CSIDL_STARTMENU 11
Carpeta Inicio CSIDL_STARTUP 7

El siguiente fragmento de código pertenece a un programa Delphi que usa la función SHGetSpecialFolderPath para recuperar
el camino correspondiente a la carpeta del menú Inicio, camino que a continuación se muestra en una ventana.

Interface

Function SHGetSpecialFolderPath(Handle: HWND; Path: PChar; Folder: Integer; Create: Bool): HRESULT; StdCall;

implementation

{$R *.DFM}

Function SHGetSpecialFolderPath; External 'Shell32.DLL' Name 'SHGetSpecialFolderPathA';

procedure TForm1.FormCreate(Sender: TObject);
Var
   Camino: String;
begin
     SetLength(Camino, MAX_PATH+1);
     SHGetSpecialFolderPath(Handle, PChar(Camino), CSIDL_STARTMENU, False);
     ShowMessage('El menú inicio está en : ' + Camino);
end;

NOTA: Para poder utilizar esta función es preciso disponer de la última versión de la librería SHELL32.DLL, ya que SHGetSpecialFolderPath no existía en la versión original de dicho archivo.