如何在 CPP 中获取 Windows 应用程序的图标?

How can I get icon of Windows app in CPP?

我正在尝试在 Win32 中构建文件管理器,但图标有问题。每当我尝试获取与 windows 10 应用程序相关联的图标(如 .png(照片应用程序))时,该图标都是空白纸。我做错了什么?提前致谢,请回答:)

BOOL InitTreeViewImageLists(HWND hwndTV) {
    HIMAGELIST himl;  // handle to image list 
    HBITMAP hbmp;     // handle to bitmap 


    // Create the image list. 
    if ((himl = ImageList_Create(16,
        16,
        ILC_COLOR16 | ILC_MASK,
        3, 0)) == NULL)
        return FALSE;


    // Add the open file, closed file, and document bitmaps.
    HICON hIcon;
    SHFILEINFO sfi;
    LPCWSTR path = L"C:\Users\Shalev\Desktop\WhatsApp.lnk";
    sfi = GetShellInfo(path);
    HICON* iconHandles = new HICON;
    hIcon = sfi.hIcon;
    cout << hIcon << endl;
    g_nOpen = sfi.iIcon;
    ImageList_AddIcon(himl, hIcon);
    sfi = GetShellInfo(L"C:\");
    hIcon = sfi.hIcon;
    g_nClosed = sfi.iIcon;
    ImageList_AddIcon(himl, hIcon);
    sfi = GetShellInfo(L"C:\");
    hIcon = sfi.hIcon;
    g_nDocument = sfi.iIcon;
    ImageList_AddIcon(himl, hIcon);

    // Associate the image list with the tree-view control. 
    TreeView_SetImageList(hwndTV, himl, TVSIL_NORMAL);

    return TRUE;

}

SHFILEINFO GetShellInfo(LPCWSTR path) {
    SHFILEINFO sfi;
    SecureZeroMemory(&sfi, sizeof(sfi));
    SHGetFileInfo(path, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX | SHGFI_SHELLICONSIZE | SHGFI_ICON | SHGFI_SMALLICON | SHGFI_USEFILEATTRIBUTES);
    return sfi;
}

你可以使用 IShellItemImageFactory interface,像这样:

...
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); // need this somewhere when your thread begins, not for every call
...
IShellItemImageFactory* factory;
if (SUCCEEDED(SHCreateItemFromParsingName(path, nullptr, IID_PPV_ARGS(&factory))))
{
    // the GetImage method defines a required size and multiple flags
    // with which you can specify you want the icon only or the thumbnail, etc.
    HBITMAP bmp;
    if (SUCCEEDED(factory->GetImage(SIZE{ 256, 256 }, SIIGBF_ICONONLY, &bmp)))
    {
        ... // do something with the HBITMAP
        DeleteObject(bmp);
    }
    factory->Release();
}

...
CoUninitialize(); // call this each time you successfully called CoInitializeEx