winapishell64-bitpath32-bit

SHGetFolderPath() 32 bit vs 64 bit


What happens if I use SHGetFolderPath api call in a 32 bit system with CSIDL_PROGRAM_FILESx86 folder id instead of the CSIDL_PROGRAM_FILES id?

Theoretically CSIDL_PROGRAM_FILESx86 should map to C:\program files (x86) in a 64 bit system but what does it map to in a 32 bit system where this path doesn't exist?


Solution

  • The different scenarios are described in this article on MSDN.

    The interpretation of certain KNOWNFOLDERID values depends on whether the folder is part of a 32-bit or 64-bit application and whether that application is running on a 32-bit or 64-bit operating system. If your application needs to distinguish between, for example, Program Files and Program Files (x86), you must use the right KNOWNFOLDERID for the situation.

    The following table summarizes the KNOWNFOLDERID use in those cases.

    OS App KNOWNFOLDERID Default Path CSIDL Equivalent
    32 bit 32 bit FOLDERID_ProgramFiles %SystemDrive%\Program Files CSIDL_PROGRAM_FILES
    32 bit 32 bit FOLDERID_ProgramFilesX86 %SystemDrive%\Program Files CSIDL_PROGRAM_FILESX86
    32 bit 32 bit FOLDERID_ProgramFilesX64 Not applicable Not applicable
    64 bit 64 bit FOLDERID_ProgramFiles %SystemDrive%\Program Files CSIDL_PROGRAM_FILES
    64 bit 64 bit FOLDERID_ProgramFilesX86 %SystemDrive%\Program Files (x86) CSIDL_PROGRAM_FILESX86
    64 bit 64 bit FOLDERID_ProgramFilesX64 %SystemDrive%\Program Files None
    64 bit 32 bit FOLDERID_ProgramFiles %SystemDrive%\Program Files (x86) CSIDL_PROGRAM_FILES
    64 bit 32 bit FOLDERID_ProgramFilesX86 %SystemDrive%\Program Files (x86) CSIDL_PROGRAM_FILESX86
    64 bit 32 bit FOLDERID_ProgramFilesX64 %SystemDrive%\Program Files None

    Summary: It will point to %SystemDrive%\Program Files