/// <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;
		}
Ejemplo n.º 2
0
        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);
        }