Solved

FolderBrowserDialogue problem

Posted on 2004-09-09
11
704 Views
Last Modified: 2013-11-20
Hi Experts,

I am fairly new to Visual C++, my expertise lies within C#. I have this problem, i have a Windows.Form it containes a listView panel, a textbox and a button. I want when users click that button the folderbrowser dialogue attribute to open and show all the files from that directory in the listView panel, also the the textbox should show the directory path of the folder selected.

Can someone direct me on how i should go about doing this. I done it in C# but find it difficult to convert it into C++.

Thank You.
Les
0
Comment
Question by:lesmydad
  • 6
  • 4
11 Comments
 
LVL 16

Expert Comment

by:kiranvj
ID: 12017797
hi...


heres one code i got from net, paste the code in ur button click event

/////////////////////////////////////
CString m_strInitDir, szDirectory;
  int  m_iImageIndex;
  HRESULT hr;
  OLECHAR       chOlePath[255];
  ULONG         pchEaten;
  ULONG         dwAttributes;
  LPSHELLFOLDER pDesktopFolder;

  BROWSEINFO browseInfo;
  LPITEMIDLIST lpItemList;
  ZeroMemory ( (PVOID) &browseInfo,sizeof (BROWSEINFO));
 
 
 
  LPMALLOC lpM;
  hr = SHGetMalloc (&lpM) ;
  if (FAILED(hr) ) return ;
 
  hr = SHGetDesktopFolder(&pDesktopFolder) ;
  if ( FAILED(hr) ) return;
 
  MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, m_strInitDir.GetBuffer(MAX_PATH), -1,
                         chOlePath, MAX_PATH);
  m_strInitDir.ReleaseBuffer (-1);
 
  hr = pDesktopFolder->ParseDisplayName(NULL,
                                            NULL,
                                            chOlePath,
                                            &pchEaten,
                                            &lpItemList,
                                            &dwAttributes);
  if (FAILED(hr))
  {
       lpM->Free (lpItemList);
       lpM->Release ();
       return ;
  }
 
  browseInfo.pidlRoot = lpItemList;
  browseInfo.hwndOwner = NULL;
  browseInfo.pszDisplayName = szDirectory.GetBuffer (MAX_PATH);
  browseInfo.lpszTitle = "Open Folder ";
  browseInfo.ulFlags = BIF_RETURNFSANCESTORS|BIF_RETURNONLYFSDIRS;
  browseInfo.lParam = (LPARAM)this;      // pass address of object to callback function

  if ((lpItemList = ::SHBrowseForFolder(&browseInfo)) == NULL)
  {
    return ;
  }
  szDirectory.ReleaseBuffer();
  m_iImageIndex = browseInfo.iImage;

  if (::SHGetPathFromIDList(lpItemList,szDirectory.GetBuffer(MAX_PATH)) )
  {
     // Get the selected directory name
    szDirectory.ReleaseBuffer();
  }

  lpM->Free(lpItemList);
  lpM->Release();
//////////////////////////////////

u can also search MSDN and on other sites for similar code. Sometimes use will get a more simpler code :)

also plz chk the link
http://www.codeproject.com/dialog/folderbrowser.asp

hope this helps
kiranvj
0
 
LVL 16

Expert Comment

by:nonubik
ID: 12017973
               HRESULT hr;
      ITEMIDLIST *pItemList;
      BROWSEINFO browseinfo;
      TCHAR path[MAX_PATH];
      hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
      if (FAILED(hr))
      {
            TRACE("CoInitEx failed: %x\n", hr);
            return;
      }
      
      IMalloc *pMalloc = NULL;
      hr = SHGetMalloc(&pMalloc);
      if (FAILED(hr))
      {
            TRACE("Can't retrieve system's IMalloc interface: %x\n", hr);
            return;
      }
      ASSERT(pMalloc);
      
      memset(&browseinfo, 0, sizeof(BROWSEINFO));
      CString strCaption;
      browseinfo.hwndOwner = GetSafeHwnd();
      browseinfo.pszDisplayName = path;
      browseinfo.ulFlags = BIF_RETURNONLYFSDIRS;
      strCaption = "Auu";
      browseinfo.lpszTitle = strCaption;
      
      pItemList = SHBrowseForFolder(&browseinfo);
      if (pItemList)
      {
            // Behold the elegance of CStrBuf!
            SHGetPathFromIDList(pItemList, path);
            pMalloc->Free(pItemList);
            UpdateData(FALSE);
      }
      pMalloc->Release();
      pMalloc = NULL;
      CoUninitialize();

Must
#include "objbase.h"
#include "shlobj.h"

Link against ole32.lib and shell32.lib
0
 
LVL 1

Author Comment

by:lesmydad
ID: 12018594
Hi nonubik

How do i link to ole32.lib and shell32.lib using visual C++ in VS.NET.

Thanks
Les
0
Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

 
LVL 16

Expert Comment

by:nonubik
ID: 12018752
Open project properties, go to Linker->Input->'Additional dependencies' field. Here enter the 2 libs
0
 
LVL 1

Author Comment

by:lesmydad
ID: 12022707
I still get some error,
error C2065: CString is undeclared identifies and same for strCaption, ASSERT identifier not found etc.

Dont have a clue why these errors are comming up, did i put the script in the wrong constructor. I pasted thed above code under the button event handler. is that could be the problem.

Thanks
Les
0
 
LVL 16

Expert Comment

by:nonubik
ID: 12024661
Replace

     ASSERT(pMalloc);
     
     memset(&browseinfo, 0, sizeof(BROWSEINFO));
     CString strCaption;
     browseinfo.hwndOwner = GetSafeHwnd();
     browseinfo.pszDisplayName = path;
     browseinfo.ulFlags = BIF_RETURNONLYFSDIRS;
     strCaption = "Auu";
     browseinfo.lpszTitle = strCaption;

with

     if(!pMalloc)
         return; //if you are within a function or some error message
     
     memset(&browseinfo, 0, sizeof(BROWSEINFO));
     TCHAR szCaption[256];
     browseinfo.hwndOwner = GetSafeHwnd();
     browseinfo.pszDisplayName = path;
     browseinfo.ulFlags = BIF_RETURNONLYFSDIRS;
     strCaption = "Auu";
     browseinfo.lpszTitle = szCaption;
0
 
LVL 1

Author Comment

by:lesmydad
ID: 12026766
Hi  nonubik

I still get errors of C2065 with strCaption = "Auu";  and around four errors on C3861 with scripts like hr = CoInitializeEx,   browseinfo.hwndOwner = GetSafeHwnd(); etc. dont have a clue why this problem is hapenning.
As i mention C++ is something new to me therefore i'm not understanding the concept properly.

Thank You
Les
0
 
LVL 16

Expert Comment

by:nonubik
ID: 12026844
sorry, my mistake :o)
>strCaption = "Auu";
replace
>lstrcat(szCaption, _T("My title"));
0
 
LVL 16

Expert Comment

by:nonubik
ID: 12026854
again, rushed
>lstrcpy(szCaption, _T("My title"));
0
 
LVL 1

Author Comment

by:lesmydad
ID: 12040019
still have other problems arosing. here are the errors which pops up:

(102): error C3861: 'CoInitializeEx': identifier not found, even with argument-dependent lookup

(105): error C3861: 'TRACE': identifier not found, even with argument-dependent lookup

(113): error C3861: 'TRACE': identifier not found, even with argument-dependent lookup

(121): error C3861: 'GetSafeHwnd': identifier not found, even with argument-dependent lookup

(134): error C3861: 'UpdateData': identifier not found, even with argument-dependent lookup

What do i do to solve them.

Thanks,
Les




0
 
LVL 16

Accepted Solution

by:
nonubik earned 100 total points
ID: 12042440
>(102):
#include "objbase.h" , link against ole32.lib

>(105) & (113)
you can comment those lines or replace TRACE(<text>)  with MessageBox(NULL, <text>, NULL, MB_OK);

>(121)
Instead of GetSafeHwnd() you can pass your form's handle or NULL

>(134)
comment the line
0

Featured Post

Live: Real-Time Solutions, Start Here

Receive instant 1:1 support from technology experts, using our real-time conversation and whiteboard interface. Your first 5 minutes are always free.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
repeatSeparator  java  challenge 13 57
Adapt this command to show who installed 29 108
unable to delete all specified values regedit 38 395
Is there a simple front-end menu system. 9 88
Introduction: Dynamic window placements and drawing on a form, simple usage of windows registry as a storage place for information. Continuing from the first article about sudoku.  There we have designed the application and put a lot of user int…
Introduction: Ownerdraw of the grid button.  A singleton class implentation and usage. Continuing from the fifth article about sudoku.   Open the project in visual studio. Go to the class view – CGridButton should be visible as a class.  R…
This video will show you how to get GIT to work in Eclipse.   It will walk you through how to install the EGit plugin in eclipse and how to checkout an existing repository.
Two types of users will appreciate AOMEI Backupper Pro: 1 - Those with PCIe drives (and haven't found cloning software that works on them). 2 - Those who want a fast clone of their boot drive (no re-boots needed) and it can clone your drive wh…

776 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question