Odczyt ścieżki dostępu do katalogów specjalnych (pulpit, kosz, moje dokumenty, ...)

Aby po kliknięciu przycisku Button1 na etykiecie Label1 wyświetlić ścieżkę dostępu do jednego z katalogów specjalnych należy skorzystać z funkcji Windows API SHGetSpecialFolderLocation i SHGetPathFromIDList (należy dołączyć plik nagłówkowy shlobj.h), poniższy przykład pokazuje sposób odczytu ścieżki dostępu do kosza:

Unit1.cpp

#include <shlobj.h>
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   LPITEMIDLIST pidl;
   LPMALLOC     pShellMalloc;
   char         Dir[MAX_PATH];

   if (SUCCEEDED(SHGetMalloc(&pShellMalloc)))
      if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_BITBUCKET, &pidl)))
      {
         if (SHGetPathFromIDList(pidl, Dir))
            Label1->Caption = Dir;
         pShellMalloc->Free(pidl);
      }

   pShellMalloc->Release();
}

Zamiast CSIDL_BITBUCKET można użyć:
(w nawiasach podane są najczęściej spotykane ścieżki dostępu)

CSIDL_CONTROLS Panel sterowania (?)
CSIDL_DESKTOP Pulpit (c:\windows\pulpit)
CSIDL_DESKTOPDIRECTORY Katalog pulpitu (c:\windows\pulpit)
CSIDL_DRIVES Mój komputer (?)
CSIDL_FONTS Czcionki (c:\windows\fonts)
CSIDL_NETHOOD Otoczenie sieciowe (c:\windows\nethood)
CSIDL_NETWORK Wirtualny folder otoczenia sieciowego (?)
CSIDL_PERSONAL Moje dokumenty (c:\moje dokumenty)
CSIDL_PRINTERS Drukarki (?)
CSIDL_PROGRAMS Programy z Menu Start (c:\windows\menu start\programy)
CSIDL_RECENT Ostatnio używane (c:\recent)
CSIDL_SENDTO Wyślij do (c:\windows\sendto)
CSIDL_STARTMENU Menu Start (c:\windows\menu start)
CSIDL_STARTUP Autostart (c:\windows\menu start\programy\autostart)
CSIDL_TEMPLATES Szablony dokumentów (c:\windows\shellnew)

Wywołanie funkcji SHGetSpecialFolderLocation z jednym z powyższych parametrów czasami może nie wyświetlić ścieżki dostępu, ponieważ nie istnieje w systemie folder dla wybranego elementu.