WMI Shell Folder GetDisplayNameOf – untangling the flags

So I have a bit of a beef with GetDisplayNameOf - I don't like the flags.  I understand that when it was created, the flexibility of flags made a ton of sense.  It wasn't well understood what potentially wildly different uses might be needed, and flags are a good alternative to a giant enumeration.  But I think there are really only about 4 possibilities that matter most of the time (caveat: I'm still pretty new to shell programming).  It's a pain to figure out the flags and there are combinations that don't even make sense.  It seems to make a lot more sense to me to use an enumeration (like in IShellItem).
Anyway, I ended up liking a solution that very similar to the one that was put into the Registry sample that a few of us are putting together (more on that later).  I created four different functions for the different GetDisplayNameOf possibilities and hopefully the table that links them to the flags isn't too scary.

HRESULT CWMIFldr::GetDisplayNameOf(

                                   /* [in] */ PCUITEMID_CHILD pidl,

                                   /* [in] */ SHGDNF uFlags,

                                   /* [out] */ STRRET *pName)



    HRESULT hr;


    ZeroMemory(pName, sizeof(*pName));


    if (!ILIsEmpty(pidl))


        static const DisplayNameFn s_rgSIGDNMapping[2][2] =


            // unfriendly                          // friendly

            {{&CWMIFldr::_GetAbsoluteParsingName}, {&CWMIFldr::_GetAbsoluteDisplayName}}, // absolute

            {{&CWMIFldr::_GetRelativeParsingName}, {&CWMIFldr::_GetRelativeDisplayName}}, // relative



        bool fRelative = (uFlags & SHGDN_INFOLDER) == SHGDN_INFOLDER;

        bool fFriendly = (uFlags & SHGDN_FORPARSING) != SHGDN_FORPARSING



        PWSTR pszDisplay;

        hr = (this->*s_rgSIGDNMapping[fRelative][fFriendly])(pidl, &pszDisplay);

        if (SUCCEEDED(hr))


            pName->uType = STRRET_WSTR;

            pName->pOleStr = pszDisplay;





        hr = E_NOTIMPL;




    return hr;


This posting is provided "AS IS" with no warranties, and confers no rights.
Use of included script samples are subject to the terms specified at http://www.microsoft.com/info/cpyright.htm 

Skip to main content