SHGetFileInfo 为 OneDrive 文件夹返回错误的图标

这些

我正在尝试用于SHGetFileInfo获取文件和文件夹的图标。我注意到它在一种情况下不起作用:我的用户配置文件文件夹中的 OneDrive 文件夹。在这种情况下,对 SHGetFileInfo 的调用成功,但我得到了可执行文件的默认图标:

我得到的不是 OneDrive 图标

这是我调用函数的方式:

HIMAGELIST imageList;
SHFILEINFO shfi;

// Get the path to the OneDrive folder
LPTSTR src = _T("%USERPROFILE%\\OneDrive");
TCHAR dest[MAX_PATH];
ExpandEnvironmentStrings(src, dest, MAX_PATH);

// Load the image from the OneDrive folder
ZeroMemory(&shfi, sizeof(shfi));
imageList = (HIMAGELIST)SHGetFileInfo(
    dest,
    FILE_ATTRIBUTE_NORMAL,
    &shfi,
    sizeof(shfi),
    SHGFI_ICON | SHGFI_SYSICONINDEX);

这是我绘制图标的方式:

case WM_PAINT:
{
    PAINTSTRUCT ps;
    HDC hdc = BeginPaint(hwnd, &ps);
    ImageList_Draw(imageList, shfi.iIcon, hdc, 0, 0, ILD_NORMAL);
    EndPaint(hwnd, &ps);
}
break;

我为 pastebin 上的应用程序制作了一个简短的自包含示例:http : //pastebin.com/bdTvEQT5

在这个简短的自包含示例中,为简洁起见,我省略了任何错误检查代码。此外,为了示例的目的,我对文件夹的位置进行了硬编码。在我的真实应用程序中,我正在枚举文件系统中的文件夹,这就是我获取 OneDrive 文件夹位置的方式。图标提取代码需要与枚举的任何文件夹一起使用。

我究竟做错了什么?

不同的

您的代码在 Windows 10 (15031) 上对我来说很好用。你从不使用shfi.hIcon所以你不需要,SHGFI_ICON虽然它不会阻止它在我的情况下工作,但你正在泄漏一个图标。

%USERPROFILE%\OneDrive可能不是 OneDrive 文件夹的位置。当有 shell 函数可以告诉你路径时,千万不要使用环境变量!

您不能假设首先存在 OneDrive 文件夹。如果尚未使用 OneDrive,则 Windows 8.1 上不存在该文件夹,因此您应该处理来自SHGetFileInfo!

我建议您将代码更改为如下所示:

PIDLIST_ABSOLUTE pidl;
HRESULT hr = SHGetKnownFolderIDList(FOLDERID_SkyDrive, 0, NULL, &pidl); // Note: Change the flags if you want to create the folder if it does not exist
if (SUCCEEDED(hr))
{
    imageList = (HIMAGELIST) SHGetFileInfo((LPTSTR) pidl, 0, &shfi, sizeof(shfi), SHGFI_PIDL | SHGFI_SYSICONINDEX);
    ILFree(pidl);
}
if (!imageList)
{
    // Fall back to a plain folder icon
    imageList = (HIMAGELIST) SHGetFileInfo(TEXT("DoesNotMatter"), FILE_ATTRIBUTE_DIRECTORY, &shfi, sizeof(shfi), SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX);
}

我无法解释您所看到的结果,缺少错误检查当然也无济于事。我猜这是其中之一:

  • 你没有在打电话之前打电话CoInitialize/ MSDN确实说您必须这样做,但它似乎不太可能返回正确的图像列表,但返回错误的图标索引。OleInitializeSHGetFileInfo
  • OneDrive 已知文件夹注册已损坏。
  • 外壳系统映像列表已损坏。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Windows 10 OneDrive文件和文件夹图标为空白和白色

来自分类Dev

SHGetFileInfo()返回错误的HICON

来自分类Dev

OneDrive 同步后受保护的文件夹为空

来自分类Dev

OneDrive错误地显示为Sharepoint存储图标

来自分类Dev

SHGetFileInfo产生带有黑色背景的图标

来自分类Dev

尝试使用从SHGetFileInfo检索到的文件夹图标时,System.Drawing.dll中的“ System.ObjectDisposedException”

来自分类Dev

SHGetFileInfo:文件扩展名的描述太短

来自分类Dev

OneDrive多个文件夹/硬盘同步

来自分类Dev

没有 lnk 覆盖箭头的 lnk 文件的 SHGetFileInfo

来自分类Dev

将大文件上传到OneDrive共享文件夹问题(createUploadSession错误)

来自分类Dev

Total Commander无法在OneDrive文件夹中打开文件

来自分类Dev

如何使用OneDrive SDK将OneDrive上的文件夹/文件上传到Windows 10 UWP

来自分类Dev

如何使用OneDrive API将文件上传到OneDrive上的共享文件夹中?

来自分类Dev

OneDrive错误:OneDrive无法连接到Windows

来自分类Dev

启动某些.lnk文件并使用Process.Start和SHGetFileInfo()获取其图标时出错

来自分类Dev

OneDrive同步文件夹中的Git存储库

来自分类Dev

.NET OneDrive Api创建文件夹问题

来自分类Dev

在特定的OneDrive文件夹中创建OneNote

来自分类Dev

无法获取OneDrive文件夹的重解析点信息

来自分类Dev

如何在OneDrive中找到“保存的图片”文件夹?

来自分类Dev

在Windows分区上访问OneDrive文件夹

来自分类Dev

如何检查OneDrive备份的文件夹的大小?

来自分类Dev

OneDrive同步文件夹的环境变量

来自分类Dev

使用API在OneDrive上创建文件夹

来自分类Dev

使用 onedrive for Business 的组织范围共享文件夹

来自分类Dev

使用OneDrive iOS SDK将图像上传到OneDrive中的文件夹

来自分类Dev

我的 OneDrive 文件夹嵌套在我的 OneDrive 文件夹中 - 我该怎么办?

来自分类Dev

C ++自定义读取函数为文件夹中的前两个文件返回错误的值

来自分类Dev

使用Dropbox / Copy / OneDrive同步文件夹而不将文件夹放在那里

Related 相关文章

  1. 1

    Windows 10 OneDrive文件和文件夹图标为空白和白色

  2. 2

    SHGetFileInfo()返回错误的HICON

  3. 3

    OneDrive 同步后受保护的文件夹为空

  4. 4

    OneDrive错误地显示为Sharepoint存储图标

  5. 5

    SHGetFileInfo产生带有黑色背景的图标

  6. 6

    尝试使用从SHGetFileInfo检索到的文件夹图标时,System.Drawing.dll中的“ System.ObjectDisposedException”

  7. 7

    SHGetFileInfo:文件扩展名的描述太短

  8. 8

    OneDrive多个文件夹/硬盘同步

  9. 9

    没有 lnk 覆盖箭头的 lnk 文件的 SHGetFileInfo

  10. 10

    将大文件上传到OneDrive共享文件夹问题(createUploadSession错误)

  11. 11

    Total Commander无法在OneDrive文件夹中打开文件

  12. 12

    如何使用OneDrive SDK将OneDrive上的文件夹/文件上传到Windows 10 UWP

  13. 13

    如何使用OneDrive API将文件上传到OneDrive上的共享文件夹中?

  14. 14

    OneDrive错误:OneDrive无法连接到Windows

  15. 15

    启动某些.lnk文件并使用Process.Start和SHGetFileInfo()获取其图标时出错

  16. 16

    OneDrive同步文件夹中的Git存储库

  17. 17

    .NET OneDrive Api创建文件夹问题

  18. 18

    在特定的OneDrive文件夹中创建OneNote

  19. 19

    无法获取OneDrive文件夹的重解析点信息

  20. 20

    如何在OneDrive中找到“保存的图片”文件夹?

  21. 21

    在Windows分区上访问OneDrive文件夹

  22. 22

    如何检查OneDrive备份的文件夹的大小?

  23. 23

    OneDrive同步文件夹的环境变量

  24. 24

    使用API在OneDrive上创建文件夹

  25. 25

    使用 onedrive for Business 的组织范围共享文件夹

  26. 26

    使用OneDrive iOS SDK将图像上传到OneDrive中的文件夹

  27. 27

    我的 OneDrive 文件夹嵌套在我的 OneDrive 文件夹中 - 我该怎么办?

  28. 28

    C ++自定义读取函数为文件夹中的前两个文件返回错误的值

  29. 29

    使用Dropbox / Copy / OneDrive同步文件夹而不将文件夹放在那里

热门标签

归档