@msdn=http://search.microsoft.com/search/results.aspx?qu=$$$ @pinvoke=http://pinvoke.net/$$$.htm Summary: SHFILEOPSTRUCT - Sructure for [SHFileOperation] !!!!C# Definition: //[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)] //If you use the above you may encounter an invalid memory access exception (when using ANSI //or see nothing (when using unicode) when you use FOF_SIMPLEPROGRESS flag. [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)] struct SHFILEOPSTRUCT { public IntPtr hwnd; public FileFuncFlags wFunc; [MarshalAs(UnmanagedType.LPWStr)] public string pFrom; [MarshalAs(UnmanagedType.LPWStr)] public string pTo; public FILEOP_FLAGS fFlags; [MarshalAs(UnmanagedType.Bool)] public bool fAnyOperationsAborted; public IntPtr hNameMappings; [MarshalAs(UnmanagedType.LPWStr)] public string lpszProgressTitle; } !!!!VB.NET Definition <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _ Public Structure SHFILEOPSTRUCT Public hwnd As IntPtr <MarshalAs(UnmanagedType.U4)>Public wFunc As FileFuncFlags <MarshalAs(UnmanagedType.LPWStr)>Public pFrom As String <MarshalAs(UnmanagedType.LPWStr)>Public pTo As String <MarshalAs(UnmanagedType.U2)>Public fFlags As FILEOP_FLAGS <MarshalAs(UnmanagedType.Bool)>Public fAnyOperationsAborted As Boolean Public hNameMappings As IntPtr <MarshalAs(UnmanagedType.LPWStr)>Public lpszProgressTitle As String ' only used if FOF_SIMPLEPROGRESS End Structure !!!!VB Definition: Public Type SHFILEOPSTRUCT hWnd As Long wFunc As FileFuncFlags pFrom As String pTo As String fFlags As FILEOP_FLAGS fAnyOperationsAborted As Long hNameMappings As Long lpszProgressTitle As String End Type !!!!User-Defined Field Types: [FileFuncFlags], [FILEOP_FLAGS] !!!!Notes: I tried to use this to send files to the recycle bin. It failed (Marshal.GetLastWin32Error was 6, invalid handle) and sometimes threw a NullReferenceException. To make it work I did the following; * Change from LPWStr to IntPtr for pFrom and pTo public IntPtr pFrom; public IntPtr pTo; * Always set hwnd to my main app window (I was using IntPtr.Zero, this might not be required) * Correctly treat pTo and pFrom as zero delimited double zero terminated. In my case I only needed pTo so I just added a null byte to the end and used Marshal.StringToHGlobalUni() to set the value !!!!Failure on 64 bit OS Under x64, the SHFILEOPSTRUCT must be declared *without* the Pack = 1 parameter, or it will fail. This is a real pain if you want your code to be platform independent, as you have to declare two separate structures, one with Pack = 1, and one without. You then have to declare two different SHFileOperation calls, one for each of the structures. Then you have to decide which one to call depending on whether you are running on 32 or 64 bit. !!!!Update on 64-bit Issue Don't declare a value for the Pack size. If you omit it, the correct value is used when marshaling and a single SHFILEOPSTRUCT can be used for both 32-bit and 64-bit operation. !!!!64 bit proof alternative You may use the functionality of the Microsoft.VisualBasic.dll(.NET framework) instead. They handle the 64 bit call well. using Microsoft.VisualBasic.FileIO; FileSystem.DeleteFile(path, UIOption.OnlyErrorDialogs, RecycleOption.SendToRecycleBin); Documentation: SHFILEOPSTRUCT@msdn on MSDN
Edit Structures.SHFILE...
You do not have permission to change this page. If you feel this is in error, please send feedback with the contact link on the main page.