/// <summary> /// /// </summary> /// <param name="hwndOwner"></param> /// <returns></returns> protected override bool RunDialog(System.IntPtr hwndOwner) { IntPtr ptr1 = IntPtr.Zero; bool flag1 = false; Win32API.SHGetSpecialFolderLocation(hwndOwner, (int)m_rootFolder, ref ptr1); if (ptr1 == IntPtr.Zero) { Win32API.SHGetSpecialFolderLocation(hwndOwner, 0, ref ptr1); if (ptr1 == IntPtr.Zero) { throw new Exception("FolderBrowserDialogNoRootFolder"); } } //Initialize the OLE to current thread. Application.OleRequired(); IntPtr ptr2 = IntPtr.Zero; try { Win32API.BROWSEINFO browseinfo1 = new Win32API.BROWSEINFO(); IntPtr ptr3 = Marshal.AllocHGlobal((int)(260 * Marshal.SystemDefaultCharSize)); IntPtr ptr4 = Marshal.AllocHGlobal((int)(260 * Marshal.SystemDefaultCharSize)); Win32API.BrowseCallbackProc proc1 = new Win32API.BrowseCallbackProc(this.FolderBrowserDialog_BrowseCallbackProc); browseinfo1.pidlRoot = ptr1; browseinfo1.hwndOwner = hwndOwner; browseinfo1.pszDisplayName = ptr3; browseinfo1.lpszTitle = m_descriptionText; browseinfo1.ulFlags = 0x40; browseinfo1.lpfn = proc1; browseinfo1.lParam = IntPtr.Zero; browseinfo1.iImage = 0; ptr2 = Win32API.SHBrowseForFolder(browseinfo1); string s = Marshal.PtrToStringAuto(ptr3); if (ptr2 != IntPtr.Zero) { Win32API.SHGetPathFromIDList(ptr2, ptr4); this.m_selectedPath = Marshal.PtrToStringAuto(ptr4); Marshal.FreeHGlobal(ptr4); Marshal.FreeHGlobal(ptr3); flag1 = true; } } finally { Win32API.IMalloc malloc1 = GetSHMalloc(); malloc1.Free(ptr1); if (ptr2 != IntPtr.Zero) { malloc1.Free(ptr2); } } return(flag1); }
protected override bool RunDialog(IntPtr hwndOwner) { var pidlRoot = IntPtr.Zero; bool result = false; Win32API.Shell32.SHGetSpecialFolderLocation(hwndOwner, (int)Environment.SpecialFolder.Desktop, ref pidlRoot); int ulFlags = Win32API.Params.BIF_NEWDIALOGSTYLE; if (!ShowNewFolderButton) { ulFlags += Win32API.Params.BIF_NONEWFOLDERBUTTON; } var pidl = IntPtr.Zero; var pszDisplayName = IntPtr.Zero; var pszPath = IntPtr.Zero; try { pszDisplayName = Marshal.AllocHGlobal(260 * Marshal.SystemDefaultCharSize); pszPath = Marshal.AllocHGlobal(260 * Marshal.SystemDefaultCharSize); var lpbi = new Win32API.BROWSEINFO { pidlRoot = pidlRoot, hwndOwner = hwndOwner, pszDisplayName = pszDisplayName, lpszTitle = Description + "", ulFlags = ulFlags, lpfn = new Win32API.BrowseCallbackProc(OnBrowseEvent), lParam = IntPtr.Zero, iImage = 0 }; pidl = Win32API.Shell32.SHBrowseForFolder(lpbi); if (pidl != IntPtr.Zero) { Win32API.Shell32.SHGetPathFromIDList(pidl, pszPath); _isCheckSelectedPath = true; _selectedPath = Marshal.PtrToStringAuto(pszPath); result = true; } } finally { var malloc = GetSHMalloc(); malloc.Free(pidlRoot); if (pidl != IntPtr.Zero) { malloc.Free(pidl); } if (pszPath != IntPtr.Zero) { Marshal.FreeHGlobal(pszPath); } if (pszDisplayName != IntPtr.Zero) { Marshal.FreeHGlobal(pszDisplayName); } } return(result); }