Notice: This website is an unofficial Microsoft Knowledge Base (hereinafter KB) archive and is intended to provide a reliable access to deleted content from Microsoft KB. All KB articles are owned by Microsoft Corporation. Read full disclaimer for more details.

How To Browse for Folders from the Current Directory


View products that this article applies to.

Summary

By default, the SHBrowseForFolder API lets the user start at the desktop to browse the shell's namespace and pick a folder. Often, you may prefer that your application start the browse dialog box at a folder that the user is likely to want, such as the current working directory.

To set the browse dialog box's initial selection, the BROWSEINFO structure must contain a callback function. When the callback function is called with the message BFFM_INITIALIZED, it can in turn send a BFFM_SETSELECTION message to set the dialog box's selection to the desired path.

↑ Back to the top


More information

Following is some sample code that brings up the browse dialog box with the current directory selected. It also displays the path of the currently selected 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;
}
				

↑ Back to the top


Properties

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.

↑ Back to the top


Keywords: kbcode, kbhowto, KB179378

↑ Back to the top

Article Info
Article ID : 179378
Revision : 4
Created on : 11/21/2006
Published on : 11/21/2006
Exists online : False
Views : 372