private static Icon GetIcon(IntPtr pidl, uint flags = 0)
        {
            PInvoke.SHFILEINFO shi = new PInvoke.SHFILEINFO();
            flags = flags | PInvoke.SHGFI_ICON | PInvoke.SHGFI_ADDOVERLAYS | PInvoke.SHGFI_PIDL;
            IntPtr hIcon = PInvoke.SHGetFileInfo(pidl, 0, out shi, (uint)(Marshal.SizeOf(shi)), flags);

            if (shi.hIcon == IntPtr.Zero)
            {
                return(null);
            }

            Icon icon = (Icon)Icon.FromHandle(shi.hIcon).Clone();

            PInvoke.DestroyIcon(shi.hIcon);
            return(icon);
        }
        private static Icon GetIcon(string fileName, uint flags = 0)
        {
            if (string.IsNullOrWhiteSpace(fileName))
            {
                return(null);
            }

            PInvoke.SHFILEINFO shi = new PInvoke.SHFILEINFO();
            flags = flags | PInvoke.SHGFI_ICON | PInvoke.SHGFI_ADDOVERLAYS;
            IntPtr hIcon = PInvoke.SHGetFileInfo(fileName, 0, out shi, (uint)(Marshal.SizeOf(shi)), flags);

            if (shi.hIcon == IntPtr.Zero)
            {
                return(null);
            }

            Icon icon = (Icon)Icon.FromHandle(shi.hIcon).Clone();

            PInvoke.DestroyIcon(shi.hIcon);
            return(icon);
        }