protected override bool RunDialog(IntPtr hWndOwner)
{
bool result = false;
if (_rootFolderLocation == IntPtr.Zero)
{
PInvoke.Shell32.SHGetSpecialFolderLocation(hWndOwner, (int)this._rootFolder, ref _rootFolderLocation);
if (_rootFolderLocation == IntPtr.Zero)
{
PInvoke.Shell32.SHGetSpecialFolderLocation(hWndOwner, 0, ref _rootFolderLocation);
if (_rootFolderLocation == IntPtr.Zero)
{
throw new InvalidOperationException("FolderBrowserDialogNoRootFolder");
}
}
}
_hwndEdit = IntPtr.Zero;
//_uiFlags = 0;
if (_dontIncludeNetworkFoldersBelowDomainLevel)
_uiFlags += BrowseFlags.BIF_DONTGOBELOWDOMAIN;
if (this._newStyle)
_uiFlags += BrowseFlags.BIF_NEWDIALOGSTYLE;
if (!this._showNewFolderButton)
_uiFlags += BrowseFlags.BIF_NONEWFOLDERBUTTON;
if (this._showEditBox)
_uiFlags += BrowseFlags.BIF_EDITBOX;
if (this._showBothFilesAndFolders)
_uiFlags += BrowseFlags.BIF_BROWSEINCLUDEFILES;
if (Control.CheckForIllegalCrossThreadCalls && (Application.OleRequired() != ApartmentState.STA))
{
throw new ThreadStateException("DebuggingException: ThreadMustBeSTA");
}
IntPtr pidl = IntPtr.Zero;
IntPtr hglobal = IntPtr.Zero;
IntPtr pszPath = IntPtr.Zero;
try
{
PInvoke.BROWSEINFO browseInfo = new PInvoke.BROWSEINFO();
hglobal = Marshal.AllocHGlobal(MAX_PATH * Marshal.SystemDefaultCharSize);
pszPath = Marshal.AllocHGlobal(MAX_PATH * Marshal.SystemDefaultCharSize);
this._callback = new PInvoke.BrowseFolderCallbackProc(this.FolderBrowserCallback);
browseInfo.pidlRoot = _rootFolderLocation;
browseInfo.Owner = hWndOwner;
browseInfo.pszDisplayName = hglobal;
browseInfo.Title = this._descriptionText;
browseInfo.Flags = _uiFlags;
browseInfo.callback = this._callback;
browseInfo.lParam = IntPtr.Zero;
browseInfo.iImage = 0;
pidl = PInvoke.Shell32.SHBrowseForFolder(browseInfo);
if (((_uiFlags & BrowseFlags.BIF_BROWSEFORPRINTER) == BrowseFlags.BIF_BROWSEFORPRINTER) ||
((_uiFlags & BrowseFlags.BIF_BROWSEFORCOMPUTER) == BrowseFlags.BIF_BROWSEFORCOMPUTER))
{
this._selectedPath = Marshal.PtrToStringAuto(browseInfo.pszDisplayName);
result = true;
}
else
{
if (pidl != IntPtr.Zero)
{
PInvoke.Shell32.SHGetPathFromIDList(pidl, pszPath);
this._selectedPathNeedsCheck = true;
this._selectedPath = Marshal.PtrToStringAuto(pszPath);
result = true;
}
}
}
finally
{
PInvoke.IMalloc sHMalloc = GetSHMalloc();
sHMalloc.Free(_rootFolderLocation);
_rootFolderLocation = IntPtr.Zero;
if (pidl != IntPtr.Zero)
{
sHMalloc.Free(pidl);
}
if (pszPath != IntPtr.Zero)
{
Marshal.FreeHGlobal(pszPath);
}
if (hglobal != IntPtr.Zero)
{
Marshal.FreeHGlobal(hglobal);
}
this._callback = null;
}
return result;
}