4

我正在开发 and 的替代IFileOpenDialogIFileSaveDialog

我几乎让它工作(至少IFileOpenDialog),但是当我想返回IShellItem代表新文件名(用户选择保存在GetResult()方法中)时,我无法SHParseDisplayName使用这个新文件名。我总是收到错误"The system cannot find the file specified"

我将欣赏一些示例或其他解决方案,也许可以解决我的问题。

编辑:

    HRESULT CFileSaveDialogProxy::GetResult( __RPC__deref_out_opt IShellItem **ppsi)
    {
        //return m_Original->GetResult(ppsi);

        WCHAR pszPath[MAX_PATH] = {0};
        HRESULT hr = ERROR_CANCELLED;

        if (m_SelectedFiles.size() > 0)
        {
            QString s = m_SelectedFiles.at(0);
            s.replace(QString("/"),QString("\\"));
            s.toWCharArray(pszPath);

            //PCIDLIST_ABSOLUTE pIdL = ILCreateFromPath(pszPath);
            PIDLIST_ABSOLUTE pIdL = NULL;
            SFGAOF out;
            hr = SHParseDisplayName(pszPath,NULL,&pIdL,SFGAO_FILESYSTEM,&out);
            if (SUCCEEDED(hr))
            {
                hr = SHCreateItemFromIDList(pIdL, IID_PPV_ARGS(ppsi));
            }
        }

        return hr;
    }
4

1 回答 1

5

您必须使用IBindCtx参数将附加数据传递给解析器,在这种情况下您自己的文件元数据,因此SHParseDisplayName()不会尝试访问真实文件来获取元数据。这在IShellFolder::ParseDisplayName()SHCreateItemFromParsingName()文档中有所描述:

指向绑定上下文的指针,用于将参数作为输入和输出传递给解析函数。这些传递的参数通常特定于数据源,并由数据源所有者记录。例如,文件系统数据源接受被解析的名称(作为WIN32_FIND_DATA结构),使用STR_FILE_SYS_BIND_DATA绑定上下文参数。可以传递 STR_PARSE_PREFER_FOLDER_BROWSING 以指示尽可能使用文件系统数据源解析 URL。使用CreateBindCtx构造绑定上下文对象并使用IBindCtx::RegisterObjectParam填充值。有关这些的完整列表,请参阅绑定上下文字符串键

并在 MSDN “Old New Thing” 博客上详细概述:

创建一个简单的 pidl:在你足够关心发送非常假的时候

于 2013-09-02T17:55:52.867 回答