フォルダ選択ダイアログを表示するソースコード

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;
}