/// <summary>Gets the array of FileNames from the FileGroupDescriptors format.</summary> public static string[] GetFileContentNames(this System.Windows.Forms.IDataObject data) { var names = new string[data.GetFileContentCount()]; if (names.Length != 0) { var bytes = data.GetFileGroupDescriptor().ToArray(); IntPtr fgdPtr = IntPtr.Zero; try { fgdPtr = Marshal.AllocHGlobal(bytes.Length); int offset = Marshal.SizeOf(typeof(UInt32)); int size = Marshal.SizeOf(typeof(FILEDESCRIPTORW)); for (int i = 0; i < names.Length; i++) { var fd = (FILEDESCRIPTORW)Marshal.PtrToStructure(fgdPtr + offset + (i * size), typeof(FILEDESCRIPTORW)); names[i] = fd.cFileName; } } finally { if (fgdPtr != IntPtr.Zero) { Marshal.FreeHGlobal(fgdPtr); } } } return(names); }