private static CollumnInfo[] GetCollumnInfo(ShellFolder2 sf2)
        {
            List<CollumnInfo> retVal = new List<CollumnInfo>();
            uint i = 1;

            while (i < 500)
            {
                ShellDll.SHCOLSTATEF state;
                int hr = sf2.GetDefaultColumnState(i, out state);
                if (hr == -2147316575) //COMException, Out of Bounds
                    break;

                PropertyKey propKey;
                hr = sf2.MapColumnToSCID(i, out propKey);
                if (hr == -2147316575) //COMException, Out of Bounds
                    break;

                retVal.Add(new CollumnInfo() { ColumnIndex = i, Flags = state, PropertyKey = propKey });

                i++;
            }
            return retVal.ToArray();
        }
        public static object GetProperty(ShellFolder2 sf2, FileInfoEx file, ref PropertyKey propKey)
        {
            PIDL pidlLookup = file.PIDLRel;
            if (pidlLookup != null)
            {
                try
                {
                    object retVal;
                    int hr = sf2.GetDetailsEx(pidlLookup.Ptr, ref propKey, out retVal);
                    if (hr != ShellAPI.S_OK)
                        Marshal.ThrowExceptionForHR(hr);

                    return retVal;
                }
                finally
                {
                    pidlLookup.Free();
                }
            }
            return null;
        }