#include <windows.h>
#include <shobjidl.h>
#include <string>
#include <iostream>
#include <shlwapi.h> // For Path functions
#pragma comment(lib, "shell32.lib")
#pragma comment(lib, "ole32.lib")
#pragma comment(lib, "shlwapi.lib")
std::wstring OpenFolderDialogWithInitialDir(const std::wstring& initialDir, HWND hwndParent = nullptr) {
std::wstring result;
IFileDialog* pfd = nullptr;
if (SUCCEEDED(CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE))) {
if (SUCCEEDED(CoCreateInstance(CLSID_FileOpenDialog, nullptr,
CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pfd)))) {
// 设置为文件夹选择模式
DWORD dwOptions;
if (SUCCEEDED(pfd->GetOptions(&dwOptions))) {
pfd->SetOptions(dwOptions | FOS_PICKFOLDERS);
}
// 设置初始目录
if (!initialDir.empty()) {
IShellItem* psiInitialDir = nullptr;
if (SUCCEEDED(SHCreateItemFromParsingName(
initialDir.c_str(),
nullptr,
IID_PPV_ARGS(&psiInitialDir)))) {
pfd->SetFolder(psiInitialDir);
psiInitialDir->Release();
}
}
// 显示对话框
if (SUCCEEDED(pfd->Show(hwndParent))) {
IShellItem* psiResult = nullptr;
if (SUCCEEDED(pfd->GetResult(&psiResult))) {
PWSTR pszPath = nullptr;
if (SUCCEEDED(psiResult->GetDisplayName(SIGDN_FILESYSPATH, &pszPath))) {
result = pszPath;
CoTaskMemFree(pszPath);
}
psiResult->Release();
}
}
pfd->Release();
}
CoUninitialize();
}
return result;
}
int main() {
std::wstring folder = OpenFolderDialogWithInitialDir(L"C:\\");
if (!folder.empty()) {
std::wcout << L"Selected folder: " << folder << std::endl;
}
else {
std::wcout << L"Selection cancelled" << 2 << std::endl;
}
return 0;
}