Skip to content

Commit b16e64d

Browse files
committed
更换选择文件夹窗口的样式
1 parent 6c014af commit b16e64d

File tree

4 files changed

+45
-38
lines changed

4 files changed

+45
-38
lines changed

src/Snap.Hutao.Remastered.Native.Packaging/Snap.Hutao.Remastered.Native.Packaging.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<NoPackageAnalysis>true</NoPackageAnalysis>
66

77
<PackageId>Snap.Hutao.Remastered.Native</PackageId>
8-
<Version>1.0.4</Version>
8+
<Version>1.0.5</Version>
99
<Authors>SnapHutaoRemasteringProject</Authors>
1010
<Description>Native x64 libraries for Snap.Hutao.Remastered</Description>
1111
<PackageTags>native;snap;hutao</PackageTags>

src/Snap.Hutao.Remastered.Native/HutaoAString.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,8 @@ class HUTAOASTRING_API HutaoAString : public hutao::CustomImplements<HutaoAStrin
8989
static bool IsNullOrEmpty(const HutaoAString& str);
9090
static HutaoAString Join(const hutao::Array<HutaoAString>& values, PCSTR separator);
9191

92+
static HutaoAString Empty;
93+
9294
private:
9395
hutao::Array<char> m_buffer; // 使用自定义Array,不使用std::string
9496

src/Snap.Hutao.Remastered.Native/HutaoNativeFileSystem.cpp

Lines changed: 40 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -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

src/Snap.Hutao.Remastered.Native/HutaoString.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,8 @@ class HUTAOSTRING_API HutaoString : public hutao::CustomImplements<HutaoString,
9191
static bool IsNullOrEmpty(const HutaoString& str);
9292
static HutaoString Join(const hutao::Array<HutaoString>& values, PCWSTR separator);
9393

94+
static HutaoString Empty;
95+
9496
private:
9597
hutao::Array<wchar_t> m_buffer; // 使用自定义Array,不使用HutaoString
9698

0 commit comments

Comments
 (0)