bool SelectFileDialogImpl::RunSelectFolderDialog(const std::wstring& title,
HWND owner,
base::FilePath* path) {
DCHECK(path);
bool result = false;
#if !defined(WINVER) || WINVER < _WIN32_WINNT_VISTA
// OLD CODE WITH SHBrowseForFolder
#else
base::win::ScopedComPtr<IFileOpenDialog> file_open_dialog;
HRESULT hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL, IID_PPV_ARGS(file_open_dialog.Receive()));
if(SUCCEEDED(hr)) {
FILEOPENDIALOGOPTIONS options;
hr = file_open_dialog->GetOptions(&options);
if(SUCCEEDED(hr)) {
options |= FOS_PICKFOLDERS | FOS_PATHMUSTEXIST;
hr = file_open_dialog->SetOptions(options);
if(SUCCEEDED(hr)) {
file_open_dialog->SetTitle(title.c_str());
hr = file_open_dialog->Show(owner);
if(SUCCEEDED(hr)) {
base::win::ScopedComPtr<IShellItem> result_item;
hr = file_open_dialog->GetResult(result_item.Receive());
if(SUCCEEDED(hr)) {
LPWSTR result_name = NULL;
hr = result_item->GetDisplayName(SIGDN_DESKTOPABSOLUTEPARSING, &result_name);
if(SUCCEEDED(hr)) {
result = true;
*path = base::FilePath(result_name);
CoTaskMemFree(result_name);
}
}
}
}
}
}
#endif
if(result) {
// According to MSDN, win2000 will not resolve shortcuts, so we do it
// ourself.
base::win::ResolveShortcut(*path, path, NULL);
}
return result;
}