You are currently offline, waiting for your internet to reconnect

How To Browse for Folders from the Current Directory

Retired KB Content Disclaimer
This article was written about products for which Microsoft no longer offers support. Therefore, this article is offered "as is" and will no longer be updated.
By default, the SHBrowseForFolder API lets the user start at the desktop tobrowse the shell's namespace and pick a folder. Often, you may prefer thatyour application start the browse dialog box at a folder that the user islikely to want, such as the current working directory.

To set the browse dialog box's initial selection, the BROWSEINFO structuremust contain a callback function. When the callback function is called withthe message BFFM_INITIALIZED, it can in turn send a BFFM_SETSELECTIONmessage to set the dialog box's selection to the desired path.
More information
Following is some sample code that brings up the browse dialog box with thecurrent directory selected. It also displays the path of the currentlyselected folder in the dialog box's status window.

Sample Code

#define STRICT#include <windows.h>#include <shlobj.h>INT CALLBACK BrowseCallbackProc(HWND hwnd,                                 UINT uMsg,                                LPARAM lp,                                 LPARAM pData) {   TCHAR szDir[MAX_PATH];   switch(uMsg)    {   case BFFM_INITIALIZED:       if (GetCurrentDirectory(sizeof(szDir)/sizeof(TCHAR), szDir))      {         // WParam is TRUE since you are passing a path.         // It would be FALSE if you were passing a pidl.         SendMessage(hwnd, BFFM_SETSELECTION, TRUE, (LPARAM)szDir);      }      break;   case BFFM_SELCHANGED:       // Set the status window to the currently selected path.      if (SHGetPathFromIDList((LPITEMIDLIST) lp ,szDir))      {         SendMessage(hwnd,BFFM_SETSTATUSTEXT,0,(LPARAM)szDir);      }      break;   }   return 0;}int APIENTRY WinMain(HINSTANCE hInstance,                     HINSTANCE hPrevInstance,                     LPSTR lpszCmdLine,                     int nCmdShow){   BROWSEINFO bi;   TCHAR szDir[MAX_PATH];   LPITEMIDLIST pidl;   LPMALLOC pMalloc;   if (SUCCEEDED(SHGetMalloc(&pMalloc)))   {      ZeroMemory(&bi,sizeof(bi));      bi.hwndOwner = NULL;      bi.pszDisplayName = 0;      bi.pidlRoot = 0;      bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_STATUSTEXT;      bi.lpfn = BrowseCallbackProc;pidl = SHBrowseForFolder(&bi); if (pidl) {     //     // Other code omited     //     pMalloc->lpVtbl->Free(pMalloc,pidl); } pMalloc->lpVtbl->Release(pMalloc);      }   }   return 0;}				

Article ID: 179378 - Last Review: 06/22/2014 18:44:00 - Revision: 3.0

Microsoft Win32 Application Programming Interface

  • kbcode kbhowto KB179378