Oma*_*gra 3 c++ winapi windows-shell
我正在开发一个替代IFileOpenDialog和IFileSaveDialog。
我几乎可以使用它(至少是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;
}
Run Code Online (Sandbox Code Playgroud)
您必须使用IBindCtx参数将其他数据传递给解析器,在这种情况下,您需要使用自己的文件元数据,因此SHParseDisplayName()将不会尝试访问实际文件来获取元数据。IShellFolder::ParseDisplayName()和SHCreateItemFromParsingName()文档中对此进行了描述:
指向绑定上下文的指针,该绑定上下文用于将参数作为输入和输出传递给解析函数。这些传递的参数通常特定于数据源,并由数据源所有者记录。例如,文件系统数据源使用STR_FILE_SYS_BIND_DATA绑定上下文参数接受正在解析的名称(作为WIN32_FIND_DATA结构)。可以传递STR_PARSE_PREFER_FOLDER_BROWSING来指示在可能的情况下使用文件系统数据源来解析URL。使用CreateBindCtx构造一个绑定上下文对象,并使用IBindCtx :: RegisterObjectParam填充值。有关它们的完整列表,请参见绑定上下文字符串键。
并在MSDN“旧事物”博客上进行了详细概述:
创建一个简单的pidl:对于您而言,在足够的时间里发送非常假的东西