@@ -446,55 +446,58 @@ HRESULT __stdcall HutaoNativeFileSystem::PickFolder(HWND hwnd, PCWSTR title, BOO
446446{
447447 AssertNonNullAndReturn (picked);
448448 AssertNonNullAndReturn (path);
449-
449+
450450 *picked = FALSE ;
451- *path = nullptr ;
452-
453- // Initialize COM for BROWSEINFO
454- HRESULT hr = CoInitializeEx (nullptr , COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
455- if (FAILED (hr) && hr != RPC_E_CHANGED_MODE)
451+ *path = &HutaoString::Empty;
452+
453+ IFileOpenDialog* pFileDialog = nullptr ;
454+ HRESULT hr = CoCreateInstance (CLSID_FileOpenDialog, nullptr , CLSCTX_ALL,
455+ IID_IFileOpenDialog, reinterpret_cast <void **>(&pFileDialog));
456+
457+ DWORD dwOptions;
458+ hr = pFileDialog->GetOptions (&dwOptions);
459+ if (SUCCEEDED (hr))
456460 {
457- ThrowForHR (hr, " CoInitializeEx failed in PickFolder" );
458- return hr;
461+ hr = pFileDialog->SetOptions (dwOptions | FOS_PICKFOLDERS);
459462 }
460-
461- // Prepare BROWSEINFOW structure
462- BROWSEINFOW bi = { 0 };
463- bi.hwndOwner = hwnd;
464- bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE;
465-
466- if (title != nullptr )
463+
464+ if (SUCCEEDED (hr) && title != nullptr )
467465 {
468- bi. lpszTitle = title;
466+ pFileDialog-> SetTitle ( title) ;
469467 }
470-
471- // Show folder dialog
472- PIDLIST_ABSOLUTE pidl = SHBrowseForFolderW (&bi);
473- if (pidl != nullptr )
468+
469+ if (SUCCEEDED (hr))
474470 {
475- wchar_t folderPath[MAX_PATH] ;
476- if (SHGetPathFromIDListW (pidl, folderPath ))
471+ hr = pFileDialog-> Show (hwnd) ;
472+ if (SUCCEEDED (hr ))
477473 {
478- *picked = TRUE ;
479- IHutaoString* pString = nullptr ;
480- hr = CreateHutaoStringFromWideString (folderPath, &pString);
474+ IShellItem* pItem = nullptr ;
475+ hr = pFileDialog->GetResult (&pItem);
481476 if (SUCCEEDED (hr))
482477 {
483- *path = pString;
478+ wchar_t * folderPath = nullptr ;
479+ hr = pItem->GetDisplayName (SIGDN_FILESYSPATH, &folderPath);
480+ if (SUCCEEDED (hr))
481+ {
482+ *picked = TRUE ;
483+ IHutaoString* pString = nullptr ;
484+ hr = CreateHutaoStringFromWideString (folderPath, &pString);
485+ if (SUCCEEDED (hr))
486+ {
487+ *path = pString;
488+ }
489+ CoTaskMemFree (folderPath);
490+ }
491+ pItem->Release ();
484492 }
485493 }
486-
487- // Free PIDL
488- CoTaskMemFree (pidl);
489- }
490-
491- CoUninitialize ();
492-
493- if (FAILED (hr))
494- {
495- ThrowForHR (hr, " PickFolder failed" );
494+ else if (hr == HRESULT_FROM_WIN32 (ERROR_CANCELLED))
495+ {
496+ hr = S_OK;
497+ }
496498 }
497-
499+ pFileDialog->Release ();
500+
498501 return hr;
499502}
500503
0 commit comments