/// <summary> /// Runs the dialog. /// </summary> /// <param name="hWndOwner">The h WND owner.</param> /// <returns></returns> protected override bool RunDialog( IntPtr hWndOwner ) { IntPtr ptr1 = IntPtr.Zero; bool flag1 = false; Win32.Shell32.SHGetSpecialFolderLocation( hWndOwner, (int)this.rootFolder, ref ptr1 ); if ( ptr1 == IntPtr.Zero ) { Win32.Shell32.SHGetSpecialFolderLocation( hWndOwner, 0, ref ptr1 ); if ( ptr1 == IntPtr.Zero ) { throw new InvalidOperationException( "ExtendedFolderBrowserDialogNoRootFolder" ); } } int flags = 0x40; if ( !this.showNewFolderButton ) { flags += 0x200; } if ( this.showEditBox ) { flags += Win32.BIF_EDITBOX; } if ( Control.CheckForIllegalCrossThreadCalls && (Application.OleRequired() != ApartmentState.STA) ) { throw new ThreadStateException( "ThreadMustBeSTA" ); } IntPtr ptr2 = IntPtr.Zero; IntPtr ptr3 = IntPtr.Zero; IntPtr ptr4 = IntPtr.Zero; try { Win32.BROWSEINFO browseinfo1 = new Win32.BROWSEINFO(); ptr3 = Marshal.AllocHGlobal( (int)(260 * Marshal.SystemDefaultCharSize) ); ptr4 = Marshal.AllocHGlobal( (int)(260 * Marshal.SystemDefaultCharSize) ); Win32.BrowseCallbackProc proc1 = new Win32.BrowseCallbackProc( this.ExtendedFolderBrowserDialog_BrowseCallbackProc ); browseinfo1.pidlRoot = ptr1; browseinfo1.hwndOwner = hWndOwner; browseinfo1.pszDisplayName = ptr3; browseinfo1.lpszTitle = this.descriptionText; browseinfo1.ulFlags = flags; browseinfo1.lpfn = proc1; browseinfo1.lParam = IntPtr.Zero; browseinfo1.iImage = 0; ptr2 = Win32.Shell32.SHBrowseForFolder( browseinfo1 ); if ( ptr2 != IntPtr.Zero ) { Win32.Shell32.SHGetPathFromIDList( ptr2, ptr4 ); this.selectedPathNeedsCheck = true; this.selectedPath = Marshal.PtrToStringAuto( ptr4 ); flag1 = true; } } finally { Win32.IMalloc malloc1 = GetSHMalloc(); malloc1.Free( ptr1 ); if ( ptr2 != IntPtr.Zero ) { malloc1.Free( ptr2 ); } if ( ptr4 != IntPtr.Zero ) { Marshal.FreeHGlobal( ptr4 ); } if ( ptr3 != IntPtr.Zero ) { Marshal.FreeHGlobal( ptr3 ); } } return flag1; }
protected override bool RunDialog( IntPtr hWndOwner) { var ptr1 = IntPtr.Zero; var flag1 = false; Win32.Shell32.SHGetSpecialFolderLocation(hWndOwner, (int)_rootFolder, ref ptr1); if (ptr1 == IntPtr.Zero) { Win32.Shell32.SHGetSpecialFolderLocation(hWndOwner, 0, ref ptr1); if (ptr1 == IntPtr.Zero) { throw new InvalidOperationException("ExtendedFolderBrowserDialogNoRootFolder"); } } var flags = 0x40; if (!ShowNewFolderButton) { flags += 0x200; } if (ShowEditBox) { flags += Win32.BIF_EDITBOX; } if (Control.CheckForIllegalCrossThreadCalls && (Application.OleRequired() != ApartmentState.STA)) { throw new ThreadStateException("ThreadMustBeSTA"); } var ptr2 = IntPtr.Zero; var ptr3 = IntPtr.Zero; var ptr4 = IntPtr.Zero; try { var browseinfo1 = new Win32.BROWSEINFO(); ptr3 = Marshal.AllocHGlobal(260 * Marshal.SystemDefaultCharSize); ptr4 = Marshal.AllocHGlobal(260 * Marshal.SystemDefaultCharSize); Win32.BrowseCallbackProc proc1 = extendedFolderBrowserDialogBrowseCallbackProc; browseinfo1.pidlRoot = ptr1; browseinfo1.hwndOwner = hWndOwner; browseinfo1.pszDisplayName = ptr3; browseinfo1.lpszTitle = _descriptionText; browseinfo1.ulFlags = flags; browseinfo1.lpfn = proc1; browseinfo1.lParam = IntPtr.Zero; browseinfo1.iImage = 0; ptr2 = Win32.Shell32.SHBrowseForFolder(browseinfo1); if (ptr2 != IntPtr.Zero) { Win32.Shell32.SHGetPathFromIDList(ptr2, ptr4); _selectedPathNeedsCheck = true; _selectedPath = Marshal.PtrToStringAuto(ptr4); flag1 = true; } } finally { var malloc1 = getShMalloc(); malloc1.Free(ptr1); if (ptr2 != IntPtr.Zero) { malloc1.Free(ptr2); } if (ptr4 != IntPtr.Zero) { Marshal.FreeHGlobal(ptr4); } if (ptr3 != IntPtr.Zero) { Marshal.FreeHGlobal(ptr3); } _nativeWindow?.ReleaseHandle(); } return(flag1); }