如何为IFileOpenDialog接口设置默认打开文件夹
如何设置IFileOpenDialog默认打开指定目录
要让IFileOpenDialog默认打开lsCurFolder参数指定的文件夹,需要借助SHCreateItemFromParsingName将路径字符串转换为IShellItem对象,再调用IFileOpenDialog::SetFolder方法设置默认目录。以下是修改后的完整代码:
inline bool OpenFile(LPTSTR& pszFilePath, const FileType fTyp = MajCut, LPCTSTR lsCurFolder) { HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); if (SUCCEEDED(hr)) { IFileOpenDialog* pFileDlg = NULL; // 创建FileOpenDialog对象 hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL, IID_IFileOpenDialog, reinterpret_cast<void**>(&pFileDlg)); if (!SetTyp(fTyp, pFileDlg, L"Vyhledej soubor pro načtení")) { pFileDlg->Release(); return false; } // --- 新增:设置默认打开目录 --- if (lsCurFolder != NULL && *lsCurFolder != _T('\0')) { IShellItem* pFolderItem = NULL; hr = SHCreateItemFromParsingName(lsCurFolder, NULL, IID_IShellItem, reinterpret_cast<void**>(&pFolderItem)); if (SUCCEEDED(hr)) { hr = pFileDlg->SetFolder(pFolderItem); pFolderItem->Release(); } } // --- 新增结束 --- FILEOPENDIALOGOPTIONS opt; pFileDlg->GetOptions(&opt); if (pFileDlg->SetOptions(opt | FOS_STRICTFILETYPES) != S_OK) { pFileDlg->Release(); return false; } if (SUCCEEDED(hr)) { // 显示打开对话框 hr = pFileDlg->Show(NULL); // 获取对话框选择的文件名 if (SUCCEEDED(hr)) { IShellItem* pItem; hr = pFileDlg->GetResult(&pItem); if (SUCCEEDED(hr)) { hr = pItem->GetDisplayName(SIGDN_FILESYSPATH, &pszFilePath); // 调用者需通过CoTaskMemFree释放内存 pItem->Release(); } } pFileDlg->Release(); } CoUninitialize(); } return SUCCEEDED(hr); }
关键步骤说明:
- 先判断
lsCurFolder是否有效(非空且不是空字符串),避免无效路径导致错误 - 调用
SHCreateItemFromParsingName将路径字符串转换为IShellItem,这是Shell接口常用的路径转换方式 - 调用
pFileDlg->SetFolder设置默认打开的目录,完成后记得释放IShellItem对象,避免内存泄漏
注意:需要确保项目链接了shell32.lib,否则SHCreateItemFromParsingName会找不到定义。
内容的提问来源于stack exchange,提问作者Michal Hadraba
相关产品推荐
相关产品推荐

