#include "stdafx.h"
#include < Shlobj.h >
TCHAR *BrowseForFolder( TCHAR *wszStartPath );
int _tmain()
{
HRESULT hr = CoInitialize( NULL );
if SUCCEEDED(hr)
{
TCHAR szCurDir[MAX_PATH];
GetCurrentDirectory(
sizeof(szCurDir)/sizeof(TCHAR), szCurDir);
//displays Browse For Folder dialog
//and selects szCurDir
TCHAR *szSelectedDir = BrowseForFolder( szCurDir );
if ( szSelectedDir != NULL )
{
//do something with the new path
}
CoUninitialize();
}
return 0;
}
INT CALLBACK BrowseCallbackProc( HWND hwnd, UINT uMsg,
LPARAM lp, LPARAM pData )
{
TCHAR szDir[MAX_PATH];
switch(uMsg)
{
case BFFM_INITIALIZED:
if ( pData ) wcscpy( szDir, (TCHAR *)pData );
else GetCurrentDirectory(
sizeof(szDir) / sizeof(TCHAR), szDir);
//selects the specified folder
//in the Browse For Folder dialog box
SendMessage(hwnd, BFFM_SETSELECTION,
TRUE, (LPARAM)szDir);
break;
case BFFM_SELCHANGED:
if (SHGetPathFromIDList(
(LPITEMIDLIST) lp, szDir))
{
//sets the status text
//in the Browse For Folder dialog box
SendMessage(hwnd, BFFM_SETSTATUSTEXT,
0, (LPARAM)szDir);
}
break;
}
return 0;
}
TCHAR *BrowseForFolder( TCHAR *wszStartPath )
{
TCHAR szwNewPath[MAX_PATH];
BROWSEINFO bInfo;
bInfo.hwndOwner = GetActiveWindow();
bInfo.pidlRoot = NULL;
bInfo.pszDisplayName = szwNewPath;
bInfo.lpszTitle = _T("Select a folder");
bInfo.ulFlags = BIF_NONEWFOLDERBUTTON
| BIF_NEWDIALOGSTYLE
| BIF_EDITBOX
//| BIF_SHAREABLE
//| BIF_RETURNFSANCESTORS
| BIF_RETURNONLYFSDIRS;
bInfo.lpfn = BrowseCallbackProc;
bInfo.lParam = (LPARAM)wszStartPath;
LPITEMIDLIST lpItem = SHBrowseForFolder( &bInfo);
if( lpItem != NULL )
{
SHGetPathFromIDList( lpItem, szwNewPath );
CoTaskMemFree( lpItem );
return szwNewPath;
}
else return NULL;
}
|
I use the GlobalFree function to release the allocated memory.
In Andrew Coates code this is
= CoTaskMemFree(lpIDList)
which is probably a better way.
The SHParseDisplayName translates the initial path to the pointer to an item identifier list (PIDL).
* * *
Windows Shell script:
oShell = CREATEOBJECT("Shell.Application")
oFolder = oShell.Application.BrowseForFolder(_screen.HWnd,;
"Select Folder", 1, "c:\Program Files")
IF NOT ISNULL(oFolder)
? oFolder.self.Path
ENDIF
|