#include <windows.h>
#include <shobjidl_core.h>
bool SelectFolder(std::wstring& selectedFolder)
{
HRESULT hrs = CoInitialize(NULL);
if (!SUCCEEDED(hrs)) {
return false;
}
IFileOpenDialog* pFileOpen;
// 创建文件选择对话框接口
if (FAILED(CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL, IID_IFileOpenDialog, reinterpret_cast<void**>(&pFileOpen))))
return false;
// 设置选择选项
DWORD dwOptions;
if (SUCCEEDED(pFileOpen->GetOptions(&dwOptions)))
{
pFileOpen->SetOptions(dwOptions | FOS_PICKFOLDERS);
}
// 显示对话框
HRESULT hr = pFileOpen->Show(NULL);
if (hr == HRESULT_FROM_WIN32(ERROR_CANCELLED))
{
// 用户取消了选择
pFileOpen->Release();
return false;
}
// 获取选中的项目
IShellItem* pItem;
if (SUCCEEDED(pFileOpen->GetResult(&pItem)))
{
// 获取文件夹的路径
PWSTR filePath;
if (SUCCEEDED(pItem->GetDisplayName(SIGDN_FILESYSPATH, &filePath)))
{
selectedFolder = filePath;
CoTaskMemFree(filePath);
}
pItem->Release();
}
pFileOpen->Release();
CoUninitialize();
return !selectedFolder.empty();
}
void selectFolder(){
TCHAR szBuffer[MAX_PATH] = { 0 };
BROWSEINFO bi;
ZeroMemory(&bi, sizeof(BROWSEINFO));
bi.hwndOwner = NULL;
bi.pszDisplayName = szBuffer;
bi.lpszTitle = NULL;// L"从下面选文件夹目录:";
bi.ulFlags = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS | BIF_NEWDIALOGSTYLE ;
LPITEMIDLIST idl = SHBrowseForFolder(&bi);
if (NULL == idl)
{
return 0;
}
SHGetPathFromIDList(idl, szBuffer);
}
二选其一