mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
319 lines
6.5 KiB
319 lines
6.5 KiB
/*++
|
|
|
|
Copyright (c) 1994-1998 Microsoft Corporation
|
|
|
|
Module Name :
|
|
|
|
dirbrows.cpp
|
|
|
|
Abstract:
|
|
|
|
Directory Browser Dialog. Allow browsing for directories only.
|
|
optionally allows UNC conversions for remote paths.
|
|
|
|
Author:
|
|
|
|
Ronald Meijer (ronaldm)
|
|
|
|
Project:
|
|
|
|
Internet Services Manager
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
//
|
|
// Include Files
|
|
//
|
|
#include "stdafx.h"
|
|
#include "common.h"
|
|
#include "dirbrows.h"
|
|
#include <dlgs.h>
|
|
|
|
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
|
|
extern HINSTANCE hDLLInstance;
|
|
|
|
|
|
|
|
static
|
|
int
|
|
BrowseCallbackProc(
|
|
IN HWND hwnd,
|
|
IN UINT uMsg,
|
|
IN LPARAM lParam,
|
|
IN LPARAM lpData
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Callback function for the folder browser
|
|
|
|
Arguments:
|
|
|
|
hwnd : Handle to the browse dialog box. The callback function can
|
|
send the following messages to this window:
|
|
|
|
BFFM_ENABLEOK Enables the OK button if the wParam parameter
|
|
is nonzero or disables it if wParam is zero.
|
|
BFFM_SETSELECTION Selects the specified folder. The lParam
|
|
parameter is the PIDL of the folder to select
|
|
if wParam is FALSE, or it is the path of the
|
|
folder otherwise.
|
|
BFFM_SETSTATUSTEXT Sets the status text to the null-terminated
|
|
string specified by the lParam parameter.
|
|
|
|
uMsg : Value identifying the event. This parameter can be one of the
|
|
following values:
|
|
|
|
0 Initialize dir path. lParam is the path.
|
|
|
|
BFFM_INITIALIZED The browse dialog box has finished
|
|
initializing. lpData is NULL.
|
|
BFFM_SELCHANGED The selection has changed. lpData
|
|
is a pointer to the item identifier list for
|
|
the newly selected folder.
|
|
|
|
lParam : Message-specific value. For more information, see the
|
|
description of uMsg.
|
|
|
|
lpData : Application-defined value that was specified in the lParam
|
|
member of the BROWSEINFO structure.
|
|
|
|
Return Value:
|
|
|
|
0
|
|
|
|
--*/
|
|
{
|
|
lpData;
|
|
static LPCTSTR lpstrDir = NULL;
|
|
|
|
switch(uMsg)
|
|
{
|
|
case 0:
|
|
lpstrDir = (LPCTSTR)lParam;
|
|
break;
|
|
|
|
case BFFM_INITIALIZED:
|
|
//
|
|
// Dialog initialized -- select desired folder
|
|
//
|
|
if (lpstrDir != NULL)
|
|
{
|
|
::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)lpstrDir);
|
|
}
|
|
break;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
|
|
CDirBrowseDlg::CDirBrowseDlg(
|
|
IN CWnd * pParent OPTIONAL,
|
|
IN LPCTSTR lpszInitialDir OPTIONAL
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Constructor for directory browser dialog
|
|
|
|
Arguments:
|
|
|
|
CWnd * pParent : Parent window or NULL
|
|
LPCTSTR lpszInitialDir : Initial directory, or NULL for current directory
|
|
|
|
Return Value:
|
|
|
|
N/A
|
|
|
|
--*/
|
|
: m_strInitialDir(lpszInitialDir)
|
|
{
|
|
VERIFY(m_bstrTitle.LoadString(hDLLInstance, IDS_BROWSE_DIRECTORY));
|
|
|
|
m_bi.pidlRoot = NULL;
|
|
m_bi.hwndOwner = pParent ? pParent->m_hWnd : NULL;
|
|
m_bi.pszDisplayName = m_szBuffer;
|
|
m_bi.lpszTitle = m_bstrTitle;
|
|
m_bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS,
|
|
m_bi.lpfn = BrowseCallbackProc;
|
|
m_bi.lParam = 0;
|
|
|
|
//
|
|
// Let the callback function know the default dir is
|
|
//
|
|
lpszInitialDir = !m_strInitialDir.IsEmpty()
|
|
? (LPCTSTR)m_strInitialDir : NULL;
|
|
BrowseCallbackProc(m_bi.hwndOwner, 0, (LPARAM)lpszInitialDir, NULL);
|
|
}
|
|
|
|
|
|
|
|
CDirBrowseDlg::~CDirBrowseDlg()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Destructor for directory browser dialog
|
|
|
|
Arguments:
|
|
|
|
N/A
|
|
|
|
Return Value:
|
|
|
|
N/A
|
|
|
|
--*/
|
|
{
|
|
if (m_bi.pidlRoot != NULL)
|
|
{
|
|
LPITEMIDLIST pidl = (LPITEMIDLIST)m_bi.pidlRoot;
|
|
|
|
//
|
|
// Free using shell allocator
|
|
//
|
|
LPMALLOC pMalloc;
|
|
if (::SHGetMalloc(&pMalloc) == NOERROR)
|
|
{
|
|
pMalloc->Free(pidl);
|
|
pMalloc->Release();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/* virtual */
|
|
int
|
|
CDirBrowseDlg::DoModal()
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Display the browser dialog, and fill in the selected directory path.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
IDOK if the OK button was pressed, IDCANCEL otherwise.
|
|
|
|
--*/
|
|
{
|
|
BOOL fSelectionMade = FALSE;
|
|
|
|
//
|
|
// Get the Shell's default allocator
|
|
//
|
|
LPMALLOC pMalloc;
|
|
if (::SHGetMalloc(&pMalloc) == NOERROR)
|
|
{
|
|
LPITEMIDLIST pidl;
|
|
|
|
if ((pidl = ::SHBrowseForFolder(&m_bi)) != NULL)
|
|
{
|
|
if (::SHGetPathFromIDList(pidl, m_szBuffer))
|
|
{
|
|
fSelectionMade = TRUE;
|
|
}
|
|
else
|
|
{
|
|
//
|
|
// OK Pressed, but no path found
|
|
//
|
|
::AfxMessageBox(IDS_BAD_BROWSE);
|
|
}
|
|
|
|
//
|
|
// Free the PIDL allocated by SHBrowseForFolder.
|
|
//
|
|
pMalloc->Free(pidl);
|
|
}
|
|
|
|
//
|
|
// Release the shell's allocator.
|
|
//
|
|
pMalloc->Release();
|
|
}
|
|
|
|
return fSelectionMade ? IDOK : IDCANCEL;
|
|
}
|
|
|
|
|
|
|
|
LPCTSTR
|
|
CDirBrowseDlg::GetFullPath(
|
|
OUT CString & strName,
|
|
IN BOOL fConvertToUNC
|
|
) const
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Get the full path selected. Optionally allow a remote path to be
|
|
converted to a UNC path.
|
|
|
|
Arguments:
|
|
|
|
CString & strName : String in which to return the directory path
|
|
BOOL fConvertToUNC : If TRUE, then if the drive selected is a network
|
|
drive, convert the path to a UNC path.
|
|
|
|
Return Value:
|
|
|
|
A pointer to the directory path string or NULL in case of error.
|
|
|
|
Notes:
|
|
|
|
This function should be called only after the dialog has been dismissed.
|
|
|
|
--*/
|
|
{
|
|
LPCTSTR lp = NULL;
|
|
|
|
try
|
|
{
|
|
strName = m_szBuffer;
|
|
lp = strName;
|
|
|
|
if (fConvertToUNC && lp != NULL)
|
|
{
|
|
//
|
|
// If it's network drive, convert it to a UNC path
|
|
//
|
|
CString strDrive, strUNC;
|
|
|
|
if (IsNetworkPath(strName, &strDrive, &strUNC))
|
|
{
|
|
strUNC += (lp + 2);
|
|
strName = strUNC;
|
|
}
|
|
|
|
lp = strName;
|
|
}
|
|
}
|
|
catch(CMemoryException * e)
|
|
{
|
|
TRACEEOLID("!!!exception getting path");
|
|
strName.Empty();
|
|
e->ReportError();
|
|
e->Delete();
|
|
}
|
|
|
|
return lp;
|
|
}
|