Hola. Te pongo un ejemplo de como utilizar la función:
#include <windows.h>
#include <shlobj.h>
int CALLBACK FuncionAuxiliar(HWND,UINT,LPARAM,LPARAM);
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
BROWSEINFO brw={0};
LPITEMIDLIST idList;
LPMALLOC ppMalloc=NULL;
char Directorio[MAX_PATH]={0};
char *DirInicial = "C:\\Archivos de programa";
SHGetMalloc(&ppMalloc);
brw.hwndOwner=NULL; // No tenemos ventana padre
brw.lpszTitle="Selecciona una carpeta";
// Utilizamos la función auxiliar para seleccionar un directorio inicial
brw.lpfn=(BFFCALLBACK)FuncionAuxiliar;
brw.lParam = (LPARAM)DirInicial;
idList = SHBrowseForFolder(&brw);
if (idList) {
SHGetPathFromIDList(idList,Directorio);
if (ppMalloc)
ppMalloc->Free(idList);
MessageBox(NULL, Directorio,"Carpeta seleccionada", MB_ICONINFORMATION|MB_OK);
}
else
MessageBox(NULL, "Cancelado por el usuario", "Aviso", MB_OK);
return 0;
}
int CALLBACK FuncionAuxiliar(HWND hWnd,UINT messg,LPARAM lParam,LPARAM lpData)
{
switch(messg)
{
case BFFM_INITIALIZED:
if (lpData)
SendMessage(hWnd,BFFM_SETSELECTION,1,lpData);
break;
}
return 0;
}
La función auxiliar no es obligatorio utilizarla, pero la puedes utilizar para muchas cosas, por ejemplo, permitir que sólo pueda seleccionar las carpetas que contengan determinados ficheros. Prueba a utilizar esta función auxiliar. Sólo te permitirá seleccionar las carpetas que contengan ficheros con la extensión "EXE".
int CALLBACK FuncionAuxiliar(HWND hWnd,UINT messg,LPARAM lParam,LPARAM lpData)
{
switch(messg)
{
case BFFM_INITIALIZED:
if (lpData)
SendMessage(hWnd,BFFM_SETSELECTION,1,lpData);
break;
case BFFM_SELCHANGED:
if (lParam)
{
HANDLE handle;
char dir[MAX_PATH]={0};
WIN32_FIND_DATA fd={0};
SHGetPathFromIDList((LPITEMIDLIST)lParam,dir);
if (dir[lstrlen(dir)-1]=='\\')
dir[lstrlen(dir)-1]='\0';
strcat(dir,"\\*.EXE");
handle = FindFirstFile(dir,&fd);
if (handle==INVALID_HANDLE_VALUE)
SendMessage(hWnd,BFFM_ENABLEOK,0,0);
else
{
FindClose(handle);
SendMessage(hWnd,BFFM_ENABLEOK,1,1);
}
}
break;
}
return 0;
}
No lo he documentado porque en la ayuda lo encontrarás todo bien detallado. Si tienes alguna duda, aquí estamos.
Un saludo.