Foros de daboweb

MULTIMEDIA, Video digital, Grabación, Diseño gráfico, Diseño web, Programación => Webmasters - Diseño Web - Programación - Diseño gráfico => Mensaje iniciado por: Asa en 08 de Diciembre de 2004, 03:20:43 pm

Título: Como se linka una libreria con Dev-cpp
Publicado por: Asa en 08 de Diciembre de 2004, 03:20:43 pm
Necesito utilizar la funcion SHBrowseForFolder y para ello necesito linkar a mi programa la libreria comdlg32.lib Llevo varios dias intentándolo pero no lo consigo. Agradeceria mucho que alguien me echara una mano diciendome detalladamente como se debe de hacer. Gracias.
Título: funcion SHBrowseForFolder...
Publicado por: ALP en 11 de Diciembre de 2004, 01:08:29 am
Hola. Te pongo un ejemplo de como utilizar la función:
Código: [Seleccionar]
#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".

Código: [Seleccionar]
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.