如果我在 32 位系统中使用 CSIDL_PROGRAM_FILESx86 文件夹 id 而不是 CSIDL_PROGRAM_FILES id 来使用 SHGetFolderPath api 调用,会发生什么?
理论上 CSIDL_PROGRAM_FILESx86 应该映射到 64 位系统中的
C:\program files (x86)
,但是在不存在此路径的 32 位系统中它会映射到什么?
MSDN 上的这篇文章描述了不同的场景。
某些
KNOWNFOLDERID
值的解释取决于该文件夹是 32 位还是 64 位应用程序的一部分,以及该应用程序是在 32 位还是 64 位操作系统上运行。例如,如果您的应用程序需要区分 Program Files
和 Program Files (x86)
,则必须根据具体情况使用正确的 KNOWNFOLDERID
。
下表总结了
KNOWNFOLDERID
在这些情况下的使用。
操作系统 | 应用程序 | 已知文件夹ID | 默认路径 | CSIDL 等效项 |
---|---|---|---|---|
32位 | 32位 | FOLDERID_ProgramFiles | %系统驱动器%\程序文件 | CSIDL_PROGRAM_FILES |
32位 | 32位 | FOLDERID_ProgramFilesX86 | %系统驱动器%\程序文件 | CSIDL_PROGRAM_FILESX86 |
32 位 | 32位 | FOLDERID_ProgramFilesX64 | 不适用 | 不适用 |
64 位 | 64 位 | FOLDERID_ProgramFiles | %系统驱动器%\程序文件 | CSIDL_PROGRAM_FILES |
64 位 | 64 位 | FOLDERID_ProgramFilesX86 | %SystemDrive%\Program Files (x86) | CSIDL_PROGRAM_FILESX86 |
64 位 | 64 位 | FOLDERID_ProgramFilesX64 | %系统驱动器%\程序文件 | 无 |
64 位 | 32位 | FOLDERID_ProgramFiles | %SystemDrive%\Program Files (x86) | CSIDL_PROGRAM_FILES |
64 位 | 32位 | FOLDERID_ProgramFilesX86 | %SystemDrive%\Program Files (x86) | CSIDL_PROGRAM_FILESX86 |
64 位 | 32位 | FOLDERID_ProgramFilesX64 | %系统驱动器%\程序文件 | 无 |
总结:它将指向%SystemDrive%\Program Files
试试这个:
GetEnvironmentVariable("ProgramW6432", szBuffer, nBufferSize);
YMMV