代码之家  ›  专栏  ›  技术社区  ›  laura

公共桌面上的SHGetFileInfo

  •  0
  • laura  · 技术社区  · 17 年前

    我在公用桌面上使用SHGetFileInfo和公用桌面上的文件时遇到问题。我将重点介绍实际的桌面文件夹(CSIDL\u COMMON\u DESKTOPDIRECTORY或通常是“C:\Users\Public\desktop”)。此外,我最近才开始看到这种行为,但我无法准确指出导致它出现故障的确切变化。对ShGetFileInfo的实际调用没有改变(据我所知)。

    所以我有这样一个(我省略了中间错误检查以缩短时间-函数调用返回成功):

    SHFILEINFOW info;
    uint32_t return_value = 0;
    uint32_t flags = SHGFI_TYPENAME|SHGFI_ICON|SHGFI_SMALLICON|SHGFI_SYSICONINDEX;
    uint32_t attributes = FILE_ATTRIBUTE_NORMAL;
    wchar_t *path = L"C:\\Users\\Public\\Desktop";
    return_value = SHGetFileInfoW(path, attributes, &info, sizeof(SHFILEINFOW), flags);
    
    printf("[%ls] %u ", path, return_value);
    

    这将返回0作为返回值。如果我使用以下命令填充路径:

    SHGetFolderPathW(NULL, CSIDL_COMMON_DESKTOPDIRECTORY, NULL, 0, path)
    

    我得到了同样的结果。但如果我使用pidl,如:

    LPITEMIDLIST pidl = NULL;
    SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_DESKTOPDIRECTORY,  &pidl);
    return_value = SHGetFileInfoW((LPCWSTR) pidl, attributes, &info, sizeof(SHFILEINFOW), flags | SHGFI_PIDL);
    

    然后我得到了我期望的东西,系统小图标列表的句柄。

    我说不出我做错了什么——而且它只发生在这个特定的文件夹上。我实际上需要目录中项目的图标,所以使用pidl现在似乎不是一个选项。关于从普通桌面检索图标的预期方式有什么想法吗?

    我应该提到这种行为发生在Windows Vista上-在XP上使用由SHGetFolderPathW填充的路径可以很好地工作

    1 回复  |  直到 17 年前
        1
  •  1
  •   user268890 user268890    16 年前

    我也有同样的问题。可以通过在程序启动时从OLE32.DLL调用函数CoInitialize来修复此问题。

    CoInitialize(0);
    return_value = SHGetFileInfoW(path, attributes, &info, sizeof(SHFILEINFOW), flags);