Учитывая KNOWNFOLDERID или его GUID, получите соответствующий значок под Windows - PullRequest
1 голос
/ 07 мая 2020

Ищете способ связать значок с ярлыком на рабочем столе с помощью C ++, когда все, что у меня есть, это его GUID - что-то вроде {82A74AEB-AEB4-465 C -A014-D097EE346D63} или его KNOWNFOLDERID

1 Ответ

2 голосов
/ 07 мая 2020

Примерно так, на основе интерфейса IShellItemImageFactory , который существует с Windows Vista:

CoInitialize(NULL);
{
    CComPtr<IKnownFolderManager> mgr;
    if (SUCCEEDED(mgr.CoCreateInstance(CLSID_KnownFolderManager)))
    {
        CComPtr<IKnownFolder> folder;
        if (SUCCEEDED(mgr->GetFolder(FOLDERID_ControlPanelFolder, &folder)))
        {
            CComHeapPtr<ITEMIDLIST> pidl;
            // I pass 0 for flags here, but mileage may differ
            if (SUCCEEDED(folder->GetIDList(0, &pidl)))
            {
                CComPtr<IShellItemImageFactory> factory;
                if (SUCCEEDED(SHCreateItemFromIDList(pidl, IID_PPV_ARGS(&factory))))
                {
                    // you can vary size and SIIGBF flags
                    HBITMAP bmp = nullptr;
                    SIZE size = { 256, 256 };
                    if (SUCCEEDED(factory->GetImage(size, SIIGBF_ICONONLY, &bmp)))
                    {
                        // etc...
                        DeleteObject(bmp);
                    }
                }
            }
        }
    }
}
CoUninitialize();

И есть даже лучший способ использовать SHCreateItemInKnownFolder функцию :

CoInitialize(NULL);
{
    CComPtr<IShellItemImageFactory> factory;
    if (SUCCEEDED(SHCreateItemInKnownFolder(FOLDERID_ControlPanelFolder, 0, NULL, IID_PPV_ARGS(&factory))))
    {
        // you can vary size and SIIGBF flags
        HBITMAP bmp = nullptr;
        SIZE size = { 256, 256 };
        if (SUCCEEDED(factory->GetImage(size, SIIGBF_ICONONLY, &bmp)))
        {
            // etc...
            DeleteObject(bmp);
        }
    }
}
CoUninitialize();

Обратите внимание, это даст вам значок в виде HBITMAP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...