繁体   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