![](/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.