GetSpecialFolderPath

Gets the path to the system special folder that is identified by the specified parameter value.

Archived content: This source code is currently inactive and may be outdated or no longer maintained or functional.

Die speziellen Verzeichnisse für Programmdateien, Benutzerdokumente oder andere Einstellungen lauten im Zweifel auf jedem System ein bisschen anders. Sie fest im Programm anzugeben hat schon zu einigen Fehlern geführt und ist generell keine praktikable Lösung. Die GetSpecialFolderPath-Funktion nimmt dem Programmierer auch die letzte Schreibarbeit ab und lässt keine Entschuldigungen mehr zu, Programme zu schreiben, die nur in bestimmten Windows-Versionen oder -Sprachen funktionieren.

Diese Funktion ist mit der .NET-Funktion Environment.GetFolderPath vergleichbar.

Note on the code quality: The content on this page is possibly a bit outdated. I’m not using C++ anymore for quite some time, but I would like to keep the existing and once useful functions available.

Download

GetSpecialFolderPath.cpp4.9 KiBQuelltext der GetSpecialFolderPath-Funktion

Contents of the file GetSpecialFolderPath.cpp:

// Gets the path to the system special folder that is identified by the specified
// parameter value.
//
// Dependencies: CString
//
// Web: http://unclassified.software/source/getspecialfolderpath

// SystemDir defines
#define SD_ROOT          0x0100
#define SD_WIN           0x0101
#define SD_SYS           0x0102

// params used for SHGetSpecialFolderPath
// only available with shell32.dll v4.71+
// copied from pladform sdk shlobj.h (SD_* was originally CSIDL_*)
// remarked values return no filesystem path
#define SD_DESKTOP                  0x0000   // <desktop>
#define SD_PROGRAMS                 0x0002   // Start Menu\Programs
#define SD_PERSONAL                 0x0005   // My Documents
#define SD_FAVORITES                0x0006   // <user name>\Favorites
#define SD_STARTUP                  0x0007   // Start Menu\Programs\Startup
#define SD_RECENT                   0x0008   // <user name>\Recent
#define SD_SENDTO                   0x0009   // <user name>\SendTo
#define SD_STARTMENU                0x000b   // <user name>\Start Menu
#define SD_DESKTOPDIRECTORY         0x0010   // <user name>\Desktop
#define SD_NETHOOD                  0x0013   // <user name>\nethood
#define SD_FONTS                    0x0014   // windows\fonts
#define SD_TEMPLATES                0x0015
#define SD_COMMON_STARTMENU         0x0016   // All Users\Start Menu
#define SD_COMMON_PROGRAMS          0X0017   // All Users\Programs
#define SD_COMMON_STARTUP           0x0018   // All Users\Startup
#define SD_COMMON_DESKTOPDIRECTORY  0x0019   // All Users\Desktop
#define SD_APPDATA                  0x001a   // <user name>\Application Data
#define SD_PRINTHOOD                0x001b   // <user name>\PrintHood
#define SD_LOCAL_APPDATA            0x001c   // <user name>\Local Settings\Application Data (non roaming)
#define SD_COMMON_FAVORITES         0x001f
#define SD_INTERNET_CACHE           0x0020
#define SD_COOKIES                  0x0021
#define SD_HISTORY                  0x0022
#define SD_COMMON_APPDATA           0x0023   // All Users\Application Data
#define SD_WINDOWS                  0x0024   // GetWindowsDirectory()
#define SD_SYSTEM                   0x0025   // GetSystemDirectory()
#define SD_PROGRAM_FILES            0x0026   // C:\Program Files
#define SD_MYPICTURES               0x0027   // C:\Program Files\My Pictures
#define SD_PROFILE                  0x0028   // USERPROFILE
#define SD_SYSTEMX86                0x0029   // x86 system directory on RISC
#define SD_PROGRAM_FILESX86         0x002a   // x86 C:\Program Files on RISC
#define SD_PROGRAM_FILES_COMMON     0x002b   // C:\Program Files\Common
#define SD_PROGRAM_FILES_COMMONX86  0x002c   // x86 Program Files\Common on RISC
#define SD_COMMON_TEMPLATES         0x002d   // All Users\Templates
#define SD_COMMON_DOCUMENTS         0x002e   // All Users\Documents
#define SD_COMMON_ADMINTOOLS        0x002f   // All Users\Start Menu\Programs\Administrative Tools
#define SD_CONNECTIONS              0x0031   // Network and Dial-up Connections
//#define SD_INTERNET                 0x0001   // Internet Explorer (icon on desktop)
//#define SD_CONTROLS                 0x0003   // My Computer\Control Panel
//#define SD_PRINTERS                 0x0004   // My Computer\Printers
//#define SD_BITBUCKET                0x000a   // <desktop>\Recycle Bin
//#define SD_DRIVES                   0x0011   // My Computer
//#define SD_NETWORK                  0x0012   // Network Neighborhood
//#define SD_ALTSTARTUP               0x001d   // non localized startup
//#define SD_COMMON_ALTSTARTUP        0x001e   // non localized common startup
//#define SD_ADMINTOOLS               0x0030   // <user name>\Start Menu\Programs\Administrative Tools

#define SD_FLAG_CREATE              0x8000   // combine with SD_ value to force folder creation in SHGetFolderPath()
#define SD_FLAG_DONT_VERIFY         0x4000   // combine with SD_ value to return an unverified folder path
#define SD_FLAG_MASK                0xFF00   // mask for all possible flag values

// runtime function
typedef BOOL (WINAPI *SHGETSPECIALFOLDERPATH)(HWND hwndOwner, LPTSTR lpszPath, int nFolder, BOOL fCreate);
SHGETSPECIALFOLDERPATH pSHGetSpecialFolderPath = 0;

// initialisation needed!
HMODULE hShellDLL = LoadLibrary("shell32.dll");
if (hShellDLL)
{
    pSHGetSpecialFolderPath =
        (SHGETSPECIALFOLDERPATH) GetProcAddress(hShellDLL, "SHGetSpecialFolderPathA");
}

// free module when finished!
FreeLibrary(hShellDLL);

CString GetSpecialFolderPath(int iType)
{
    CString str;
    int i = MAX_PATH + 1;
    switch (iType)
    {
        case SD_ROOT:
            str = GetSpecialFolderPath(SD_WIN);
            str = str.Left(3);
            break;
        case SD_WIN:
            GetWindowsDirectory(str.GetBuffer(i), i);
            str.ReleaseBuffer();
            break;
        case SD_SYS:
            GetSystemDirectory(str.GetBuffer(i), i);
            str.ReleaseBuffer();
            break;
        default:
            if (pSHGetSpecialFolderPath)
            {
                pSHGetSpecialFolderPath(NULL, str.GetBuffer(MAX_PATH + 1), iType, FALSE);
                str.ReleaseBuffer();
            }
            else
            {
                str = "";
            }
            break;
    }
    return str;
}

Licence and terms of use

This software is freely available as source code and compiled version, without restrictions (“public domain”). There is no warranty, not even for merchantability or fitness for a particular purpose. I am not liable for any damage caused through appropriate or inappropriate use.

Statistic data

  • Created on 2007-04-02.