in Docs-ContextMenuSample/ExplorerCommandVerb/ShellHelpers.h [175:224]
__inline HRESULT ShellAttributesToString(SFGAOF sfgaof, PWSTR *ppsz)
{
*ppsz = NULL;
static const struct { PCWSTR pszName; SFGAOF sfgaof; } c_rgItemAttributes[] =
{
// note, SFGAO_HASSUBFOLDER is too expesnive to compute
// and has been excluded from this list
MAP_ENTRY(SFGAO_STREAM),
MAP_ENTRY(SFGAO_FOLDER),
MAP_ENTRY(SFGAO_FILESYSTEM),
MAP_ENTRY(SFGAO_FILESYSANCESTOR),
MAP_ENTRY(SFGAO_STORAGE),
MAP_ENTRY(SFGAO_STORAGEANCESTOR),
MAP_ENTRY(SFGAO_LINK),
MAP_ENTRY(SFGAO_CANCOPY),
MAP_ENTRY(SFGAO_CANMOVE),
MAP_ENTRY(SFGAO_CANLINK),
MAP_ENTRY(SFGAO_CANRENAME),
MAP_ENTRY(SFGAO_CANDELETE),
MAP_ENTRY(SFGAO_HASPROPSHEET),
MAP_ENTRY(SFGAO_DROPTARGET),
MAP_ENTRY(SFGAO_ENCRYPTED),
MAP_ENTRY(SFGAO_ISSLOW),
MAP_ENTRY(SFGAO_GHOSTED),
MAP_ENTRY(SFGAO_SHARE),
MAP_ENTRY(SFGAO_READONLY),
MAP_ENTRY(SFGAO_HIDDEN),
MAP_ENTRY(SFGAO_REMOVABLE),
MAP_ENTRY(SFGAO_COMPRESSED),
MAP_ENTRY(SFGAO_BROWSABLE),
MAP_ENTRY(SFGAO_NONENUMERATED),
MAP_ENTRY(SFGAO_NEWCONTENT),
};
WCHAR sz[512] = {};
PWSTR psz = sz;
size_t cch = ARRAYSIZE(sz);
StringCchPrintfEx(psz, cch, &psz, &cch, 0, L"0x%08X", sfgaof);
for (int i = 0; i < ARRAYSIZE(c_rgItemAttributes); i++)
{
if (c_rgItemAttributes[i].sfgaof & sfgaof)
{
StringCchPrintfEx(psz, cch, &psz, &cch, 0, L", %s", c_rgItemAttributes[i].pszName);
}
}
return SHStrDup(sz, ppsz);
}