See the question and my original answer on StackOverflow

Here is a piece of code that will dump this out. The child's IPropertyStore does not return these, I don't know why, so we have to use the old IShellFolder2::GetDetailsEx method with a special column id (which is the same as a PROPERTYKEY).

CComPtr<IShellItem> cpl;
CComPtr<IShellFolder2> folder;
CComPtr<IEnumShellItems> enumerator;
SHCreateItemFromParsingName(L"::{26EE0668-A00A-44D7-9371-BEB064C98683}\\8\\::{7B81BE6A-CE2B-4676-A29E-EB907A5126C5}", nullptr, IID_PPV_ARGS(&cpl));

// bind to IShellFolder
cpl->BindToHandler(NULL, BHID_SFObject, IID_PPV_ARGS(&folder));

// bind to IEnumShellItems
cpl->BindToHandler(NULL, BHID_EnumItems, IID_PPV_ARGS(&enumerator));

// get this property key's value
PSGetPropertyKeyFromName(L"System.Software.InstallLocation", &pkLocation);

for (CComPtr<IShellItem> child; enumerator->Next(1, &child, nullptr) == S_OK; child.Release())
    // get child's display name
    CComHeapPtr<wchar_t> name;
    child->GetDisplayName(SIGDN_NORMALDISPLAY, &name);
    wprintf(L"%s\n", name);

    // get child's PIDL
    CComHeapPtr<ITEMIDLIST> pidl;
    SHGetIDListFromObject(child, &pidl);

    // the PIDL is absolute, we need the relative one (the last itemId in the list)
    // get it's install location
    CComVariant v;
    if (SUCCEEDED(folder->GetDetailsEx(ILFindLastID(pidl), &pkLocation, &v)))
        // it's a VT_BSTR
        wprintf(L" %s\n", v.bstrVal);

Note it's using an undocumented System.Software.InstallLocation PROPERTYKEY. To find it I just dumped all columns with a code like this for each child:

    int iCol = 0;
        SHCOLUMNID colId;
        if (FAILED(folder->MapColumnToSCID(iCol, &colId)))
            break; // last column

        CComHeapPtr<wchar_t> name;
        PSGetNameFromPropertyKey(colId, &name);

        CComVariant v;
        if (SUCCEEDED(folder->GetDetailsEx(ILFindLastID(pidl), &colId, &v)))
            if (v.vt == VT_BSTR)
                wprintf(L" %s: %s\n", name, v.bstrVal);
                wprintf(L" %s vt: %i\n", name, v.vt);

    } while (true);

PS: I've not added much error checking, but you should.