private DialogResult ShowNativeDialog(IWin32Window owner)
{
var rootFolder = IntPtr.Zero;
NativeMethods.SHGetSpecialFolderLocation(owner.Handle, (int)RootFolder, ref rootFolder);
if (rootFolder == IntPtr.Zero)
{
NativeMethods.SHGetSpecialFolderLocation(owner.Handle, (int)Environment.SpecialFolder.Desktop, ref rootFolder);
if (rootFolder == IntPtr.Zero)
throw new InvalidOperationException("Cannot resolve root folder");
}
uint options = NativeMethods.BIF_NEWDIALOGSTYLE;
if (ShowEditBox)
options |= NativeMethods.BIF_EDITBOX;
if (!ShowNewFolderButton)
options |= NativeMethods.BIF_NONEWFOLDERBUTTON;
var result = IntPtr.Zero;
var displayName = IntPtr.Zero;
var selectedPath = IntPtr.Zero;
try
{
var bi = new NativeMethods.BROWSEINFO();
displayName = Marshal.AllocHGlobal(NativeMethods.MAX_PATH * Marshal.SystemDefaultCharSize);
selectedPath = Marshal.AllocHGlobal(NativeMethods.MAX_PATH * Marshal.SystemDefaultCharSize);
bi.pidlRoot = rootFolder;
bi.hwndOwner = owner.Handle;
bi.pszDisplayName = displayName;
bi.lpszTitle = Description;
bi.ulFlags = options;
result = NativeMethods.SHBrowseForFolder(bi);
if (result != IntPtr.Zero)
{
NativeMethods.SHGetPathFromIDList(result, selectedPath);
SelectedPath = Marshal.PtrToStringAuto(selectedPath);
return DialogResult.OK;
}
return DialogResult.Cancel;
}
finally
{
NativeMethods.CoTaskMemFree(rootFolder);
if (result != IntPtr.Zero)
NativeMethods.CoTaskMemFree(result);
if (selectedPath != IntPtr.Zero)
Marshal.FreeHGlobal(selectedPath);
if (displayName != IntPtr.Zero)
Marshal.FreeHGlobal(displayName);
}
}