int CALLBACK _SHBrowseForFolderCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData)
{
if (uMsg == BFFM_INITIALIZED) {
::SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);
}
return 0;
}
BOOL SelectFolderDlg(HWND hParent, CString &strFolder, const CString &strIniFolder, BOOL bAvailNewFolder)
{
::CoInitializeEx(0, COINIT_APARTMENTTHREADED);
BOOL bOpen = FALSE;
TCHAR lpszPath[MAX_PATH];
LPMALLOC lpMalloc;
BROWSEINFO sInfo;
LPITEMIDLIST lpidlRoot;
LPITEMIDLIST lpidlBrowse;
if (::SHGetMalloc(&lpMalloc) != NOERROR) {
return false;
}
strFolder.Empty();
CString strInitialFolder = strIniFolder;
if (!strInitialFolder.IsEmpty()) {
if (strInitialFolder.Right(1) == _T("\\")) {
strInitialFolder = strInitialFolder.Left(strInitialFolder.GetLength() - 1);
}
}
::SHGetSpecialFolderLocation(hParent, CSIDL_DESKTOP, &lpidlRoot);
::ZeroMemory(&sInfo, sizeof(BROWSEINFO));
sInfo.hwndOwner = hParent;
sInfo.pidlRoot = lpidlRoot;
sInfo.pszDisplayName = lpszPath;
sInfo.lpszTitle = _T("フォルダ選択");
sInfo.ulFlags = BIF_RETURNONLYFSDIRS;
if (bAvailNewFolder) sInfo.ulFlags |= BIF_EDITBOX | BIF_NEWDIALOGSTYLE | BIF_USENEWUI;
sInfo.lpfn = _SHBrowseForFolderCallbackProc;
sInfo.lParam = (LPARAM)strInitialFolder.GetBuffer(MAX_PATH);
lpidlBrowse = ::SHBrowseForFolder(&sInfo);
strInitialFolder.ReleaseBuffer();
if (lpidlBrowse) {
::SHGetPathFromIDList(lpidlBrowse, lpszPath);
strFolder = lpszPath;
if (!strFolder.IsEmpty()) {
if (strFolder.Right(1) != _T("\\")) {
strFolder += _T("\\");
}
}
bOpen = TRUE;
}
if (lpidlBrowse) {
::CoTaskMemFree(lpidlBrowse);
lpidlBrowse = 0;
}
if (lpidlRoot) {
::CoTaskMemFree(lpidlRoot);
lpidlRoot = 0;
}
if (lpMalloc) {
lpMalloc->Release();
lpMalloc = 0;
}
::CoUninitialize();
return bOpen;
}