![](/img/trans.png)
[英]Why does CMake default to Program Files x86 when compiling 64 bit program?
[英]Why does FOLDERID_ProgramFiles return “C:\Program Files (x86)”?
#include <Shlobj.h>
#include <iostream>
#include <string>
std::string fun(REFKNOWNFOLDERID val) {
ITEMIDLIST* pIDList;
if (S_OK == SHGetKnownFolderIDList (val, 0, NULL, & pIDList))
{
char cpath[MAX_PATH] = {0};
if (TRUE == SHGetPathFromIDList(pIDList, cpath))
return cpath;
}
return "failed";
}
int main() {
std::cout << "--> " << fun(FOLDERID_ProgramFiles) << std::endl;
std::cout << "--> " << fun(FOLDERID_ProgramFilesX86) << std::endl;
std::cout << "--> " << fun(FOLDERID_ProgramFilesX64) << std::endl;
}
输出是:
--> C:\Program Files (x86)
--> C:\Program Files (x86)
--> failed
我使用cl.exe test.cpp shell32.lib
编译它。
我期待FOLDERID_ProgramFiles
为“C:\\Program Files”。 我的系统是基于 x64 的。 为什么我会收到“程序文件 (x86)”?
发生这种情况是因为您将应用程序编译为 32 位可执行文件,即使您是在 64 位系统上运行它。 所以FOLDERID_ProgramFiles
映射到 32 位Program Files (x86)
文件夹。
根据KNOWNFOLDERID
文档, FOLDERID_ProgramFilesX64
失败这一事实尤其明显:
FOLDERID_ProgramFilesX64
32 位操作系统不支持此值。 在 64 位操作系统上运行的 32 位应用程序也不支持它。 在任一情况下尝试使用 FOLDERID_ProgramFilesX64 都会导致错误。 有关详细信息,请参阅备注。
这在文档的备注部分有更详细的介绍:
某些 KNOWNFOLDERID 值的解释取决于文件夹是 32 位还是 64 位应用程序的一部分,以及该应用程序是在 32 位还是 64 位操作系统上运行。 例如,如果您的应用程序需要区分 Program Files 和 Program Files (x86),则必须针对这种情况使用正确的 KNOWNFOLDERID。
下表总结了在这些情况下 KNOWNFOLDERID 的使用。
FOLDERID_ProgramFiles
操作系统 应用 已知文件夹ID 默认路径 CSIDL 等价物 32位 32位 FOLDERID_ProgramFiles %SystemDrive%\\程序文件 CSIDL_PROGRAM_FILES 32位 32位 FOLDERID_ProgramFilesX86 %SystemDrive%\\程序文件 CSIDL_PROGRAM_FILESX86 32位 32位 FOLDERID_ProgramFilesX64(32 位操作系统不支持) 不适用 不适用 64位 64位 FOLDERID_ProgramFiles %SystemDrive%\\程序文件 CSIDL_PROGRAM_FILES 64位 64位 FOLDERID_ProgramFilesX86 %SystemDrive%\\Program Files (x86) CSIDL_PROGRAM_FILESX86 64位 64位 FOLDERID_ProgramFilesX64 %SystemDrive%\\程序文件 没有任何 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(32 位应用程序不支持) 不适用 不适用
此 32 位/64 位问题也会影响FOLDERID_ProgramFilesCommon
和FOLDERID_System
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.