void CxxxDlg::FolderSelectDlg(LPCTSTR pszDefFolder, CString &strResultDir){ BROWSEINFO bi; TCHAR szDir[MAX_PATH]; LPITEMIDLIST lpItemList; LPMALLOC pMalloc; // Shell の標準のアロケータを取得 if(!SUCCEEDED(SHGetMalloc(&pMalloc))){ return; } // BROWSEINFO 構造体を埋める memset(&bi, 0, sizeof(bi)); bi.hwndOwner = m_hWnd; // オーナーウィンドウハンドルを設定 bi.pidlRoot = 0; bi.pszDisplayName = 0; bi.lpszTitle = "フォルダ選択"; bi.ulFlags = BIF_RETURNONLYFSDIRS; //ダイアログを開いた際のフォルダを指定する場合は、コールバック関数を利用します。 //bi.lpfn = BrowseCallbackProc; //bi.lParam = (LPARAM)pszDefFolder; bi.lpfn = NULL; bi.lParam = 0; // フォルダの参照ダイアログボックスの表示 lpItemList = SHBrowseForFolder(&bi); if(pidl){ // PIDL をファイルシステムのパスに変換 if(SHGetPathFromIDList(lpItemList, szDir)){ strResultDir = szDir; } // SHBrowseForFolder によって割り当てられた PIDL を解放 pMalloc->Free(lpItemList); } // Shell のアロケータを開放 pMalloc->Release(); } int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lp, LPARAM pData){ switch (uMsg){ case BFFM_INITIALIZED: //第4引数には、BROWSEINFOのlParamで設定した値が渡されてくる。 ::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, pData); break; default: break; } return 0; } |