gpt4 book ai didi

winapi - SHGetFileInfo() 返回错误的 HICON

转载 作者:行者123 更新时间:2023-12-04 13:38:56 24 4
gpt4 key购买 nike

我正在尝试为任何文件获取一个图标(如 HICON),以与资源管理器完全相同的方式绘制它。这意味着如果我有一个 exe 文件的路径,我应该绘制它的默认图标。如果我有一个链接 (.lnk) 文件,我必须绘制一个图标,分配给该链接(如果有),否则绘制其目标文件图标。

不幸的是,应该返回图标的 SHGetFileInfo() 对于多个链接文件不起作用。这是代码:

SHFILEINFO fi = {0};
::SHGetFileInfo(L"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Windows Mobile Device Center.lnk",
//::SHGetFileInfo(L"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\TortoiseGit\\TortoiseGitMerge.lnk",
0, &fi, sizeof(fi), SHGFI_ICON /*| SHGFI_SMALLICON*/);

CPaintDC dc(this);
dc.DrawIcon(0, 0, fi.hIcon);

第一个文件呈现如下(正确):

enter image description here

第二个渲染如下(不正确):

enter image description here

但是资源管理器将其呈现为:

enter image description here

我尝试过 SHGFI_SMALLICON 修饰符,但没有成功。如何获取这两种情况的图标?或者也许还有其他功能可以完成此任务?

更新

问题是应用程序是 x86,操作系统是 x64。有没有办法解决它不分支到 2 个版本的问题?

最佳答案

如果你确实想获得与 Explorer 相同的行为,那么你需要使用与 Explorer 使用的相同的 Shell 接口(interface),例如 IExtractIconIExtractImage :

There are two ways to retrieve an object's icon. The simplest way is to call SHGetFileInfo. However, this approach is inflexible and may be slow. A more flexible and efficient way to retrieve an item's icon is to use IExtractIcon. The Shell uses IExtractIcon to retrieve icons when it displays the contents of a folder. To use IExtractIcon to retrieve an object's icon, do the following:

  1. Get a pointer to the IShellFolder interface of the folder that contains the object.
  2. Call IShellFolder::GetUIObjectOf with the pointer to an item identifier list (PIDL) of the object and the interface ID of IExtractIcon (IID_IExtractIcon). The folder creates an object to handle the icon extraction, and returns the object's IExtractIcon interface pointer.
  3. Call IExtractIcon::GetIconLocation to retrieve the icon's location.
  4. Call IExtractIcon::Extract to retrieve the icon's handle.

Use IExtractImage if you are implementing a view of namespace objects, and want to display thumbnail images. You can use a Shell folder's IShellFolder::GetUIObjectOf method to bind to its IExtractImage interface.

请记住,Shell 中的所有内容均由 PIDL 表示,因此可以通过 IShellFolder 访问以及相关接口(interface)。

您可以使用 SHParseDisplayName() 将路径和文件名转换为绝对 PIDL ,然后使用 SHBindToParent() 获取其父文件夹的 IShellFolder .

关于winapi - SHGetFileInfo() 返回错误的 HICON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26843464/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com