You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:53:22