반응형

Open/Save 파일폴더 경로얻기

 

 

폴더 경로 얻기

int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM /*lParam*/, LPARAM lpData);

 

BOOL BrowseForFolder( WCHAR *pwFolderPath, WCHAR *pwInitialFolder )

{

             LPMALLOC pMalloc = NULL;

             WCHAR wszDisplayName [MAX_PATH];

             BROWSEINFO bi;

             BOOL bRet = FALSE;

 

             ZeroMemory(&bi, sizeof(bi));

 

             if ( SUCCEEDED(::SHGetMalloc(&pMalloc)) )

             {           

                          bi.lpszTitle =_T("Title Text");    

                          // 선택된아이템을리턴받을버퍼(폴더명만)

                           bi.pszDisplayName = wszDisplayName; 

                           // Parent Window Handle;

                          bi.hwndOwner = NULL;                  

                           // Callback Function 주소

                          bi.lpfn = BrowseCallbackProc;                                      

                           // Callback Function으로전달한parameter

                          bi.lParam = (LPARAM)pwInitialFolder; 

                           bi.pidlRoot = NULL;

                          // BIF_USENEWUI - 새폴더생성+EditBox

                          // BIF_DONTGOBELOWDOMAIN - nework표시안함

                           bi.ulFlags = BIF_RETURNONLYFSDIRS;

                           bi.iImage = -1;

 

                           LPITEMIDLIST pidl = ::SHBrowseForFolder(&bi);

                           if (pidl != NULL)

                           {

                                        if ( ::SHGetPathFromIDList(pidl, pwFolderPath) ) // Get Item FullPath

                                        {

                                                     bRet = TRUE;

                                        }

 

                                        pMalloc->Free(pidl);

                           }

 

                           pMalloc->Release();

                           pMalloc = NULL;

             }

 

             return bRet;

}

 

int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM /*lParam*/, LPARAM lpData)

{

             if (uMsg == BFFM_INITIALIZED)

             {

                           //BROWSEINFO.lParam에서 설정 해준 값이 lpData로넘어온다.

                           // LPARAM으로 path를 넘겨주려면 WParamTRUE,

                           // PIDL을 넘겨주려면 FALSE로 넘겨준다.

                          if ( lpData )
                            
SendMessage
(hwnd, BFFM_SETSELECTION, (WPARAM)TRUE, (LPARAM)lpData);

             }

 

             return 0;

}

n  폴더선택창이 팝업될 때 기본 선택 경로를 설정하려면 BROWSEINFO.lpfn를 등록한 후, 위 예제의 BrowseCallbackProc 와 같이 처리하면 된다.

 

파일 경로 얻기

#include <commdlg.h>
BOOL
GetOpenFilePath( WCHAR *pwFilePath, WCHAR *pwInitialFolder )

{

             OPENFILENAME ofn;

 

             ZeroMemory(&ofn, sizeof(OPENFILENAME));

 

             ofn.lStructSize = sizeof(OPENFILENAME);

             ofn.hwndOwner = NULL;

             // File Filter

             ofn.lpstrFilter = L"Exe Files (*.exe)\0*.exe\0Dll Files (*.dll)\0*.dll\0\0";                     

             ofn.lpstrInitialDir = pwInitialFolder;      // InitialFolder

             ofn.lpstrFile = pwFilePath;     // Default FileName / Output FilePath

             ofn.nMaxFile = MAX_PATH; // The size, in characters, of the buffer pointed to by lpstrFile

             ofn.lpstrDefExt = NULL;           // The default extension

             ofn.lpstrTitle = L"파일을선택하세요"; // Title

             ofn.Flags = OFN_HIDEREADONLY | OFN_EXPLORER | OFN_OVERWRITEPROMPT;

 

             //if ( ::GetSaveFileName(&ofn) == FALSE ) Save 파일이름 얻기

             if ( ::GetOpenFileName(&ofn) == FALSE ) // - Open 파일이름 얻기

             {

                           DWORD dw = CommDlgExtendedError();

                  return FALSE;

             }

 

             return TRUE;

}

n  GetSaveFileName()/GetOpenFileName()함수의 상세 에러코드는 GetLastError()가 아닌 CommDlgExtendedError() API를 이용해 확인 해야 한다.

n  여기서 주의해야 할점은 OPENFILENAME.lpstrFile 필드는 디폴트 파일명을 셋팅하는데도 사용되며, 디폴트 파일명을 사용하지 않더라도 버퍼의 첫번째 문자는 널 문자로 설정되어야 한다.
그렇지 않을 경우, FNERR_INVALIDFILENAME(0x00003002)가 발생하여 다이얼로그 생성에 실패한다.(즉 해당 버퍼는 반드시 초기화 되어야 한다.)

 

 

 

Windows Vista 이후의 OS에서는 IFileDialog 인터페이스를 통해, 파일/폴더 이름 얻기가 가능하다.

MSDN에서 [Cmmon Item Dialog]을 키워드로 검색하거나 아래 링크를 확인해 보면 자세한 정보가 기술되어 있다.

n  http://msdn.microsoft.com/en-us/library/bb776913(v=VS.85).aspx

관련 샘플은 아래의 경로에서도 확인 가능하다.

n  C:\Program Files (x86)\Microsoft Visual Studio X.0\VC\atlmfc\src\mfc\dlgfile.cpp

 

반응형

+ Recent posts