public void ShowDialog()
        {
            m_FullName    = "";
            m_DisplayName = "";

            // Get shell's memory allocator, it is needed to free some memory later
            IMalloc pMalloc;

            pMalloc = ShellFunctions.GetMalloc();

            IntPtr pidlRoot;

            if (RootType == RootTypeOptions.BySpecialFolder)
            {
                ShellApi.SHGetFolderLocation(hwndOwner, (int)RootSpecialFolder, UserToken, 0, out pidlRoot);
            }
            else        // m_RootType = RootTypeOptions.ByPath
            {
                uint iAttribute;
                ShellApi.SHParseDisplayName(RootPath, IntPtr.Zero, out pidlRoot, 0, out iAttribute);
            }

            ShellApi.BROWSEINFO bi = new ShellApi.BROWSEINFO();

            bi.hwndOwner      = hwndOwner;
            bi.pidlRoot       = pidlRoot;
            bi.pszDisplayName = new String(' ', 256);
            bi.lpszTitle      = Title;
            bi.ulFlags        = (uint)DetailsFlags;
            bi.lParam         = 0;
            bi.lpfn           = new ShellApi.BrowseCallbackProc(this.myBrowseCallbackProc);

            // Show dialog
            IntPtr pidlSelected;

            pidlSelected = ShellApi.SHBrowseForFolder(ref bi);

            // Save the display name
            m_DisplayName = bi.pszDisplayName.ToString();

            IShellFolder isf = ShellFunctions.GetDesktopFolder();

            ShellApi.STRRET ptrDisplayName;
            isf.GetDisplayNameOf(pidlSelected, (uint)ShellApi.SHGNO.SHGDN_NORMAL | (uint)ShellApi.SHGNO.SHGDN_FORPARSING, out ptrDisplayName);

            String sDisplay;

            ShellApi.StrRetToBSTR(ref ptrDisplayName, pidlRoot, out sDisplay);
            m_FullName = sDisplay;

            if (pidlRoot != IntPtr.Zero)
            {
                pMalloc.Free(pidlRoot);
            }

            if (pidlSelected != IntPtr.Zero)
            {
                pMalloc.Free(pidlSelected);
            }

            Marshal.ReleaseComObject(isf);
            Marshal.ReleaseComObject(pMalloc);
        }