簡體   English   中英

為什么 FOLDERID_ProgramFiles 返回“C:\\Program Files (x86)”?

[英]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_ProgramFilesCommonFOLDERID_System

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM