我正在开发一个替代品IFileOpenDialog
and IFileSaveDialog
.
我几乎让它工作了(至少IFileOpenDialog
),但是当我想返回时IShellItem
代表新文件名(用户选择保存在GetResult()
方法),我无法得到SHParseDisplayName
使用这个新文件名。我总是收到错误"The system cannot find the file specified"
.
我将欣赏一些可能解决我的问题的例子或其他解决方案。
Edit:
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;
}
你必须使用IBindCtx
参数将附加数据传递给解析器,在本例中是您自己的文件元数据,因此SHParseDisplayName()
不会尝试访问真实文件来获取元数据。这在IShellFolder::ParseDisplayName() https://learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-ishellfolder-parsedisplayname and SHCreateItemFromParsingName() https://learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-shcreateitemfromparsingname文档:
指向绑定上下文的指针,用于将参数作为输入和输出传递给解析函数。这些传递的参数通常特定于数据源,并由数据源所有者记录。例如,文件系统数据源接受正在解析的名称(作为WIN32_FIND_DATA https://learn.microsoft.com/en-us/windows/win32/api/minwinbase/ns-minwinbase-win32_find_dataa结构),使用STR_FILE_SYS_BIND_DATA https://learn.microsoft.com/en-us/windows/win32/shell/str-constants#STR_FILE_SYS_BIND_DATA绑定上下文参数。可以传递 STR_PARSE_PREFER_FOLDER_BROWSING 以指示在可能的情况下使用文件系统数据源来解析 URL。使用构造绑定上下文对象创建绑定Ctx https://learn.microsoft.com/en-us/windows/win32/api/objbase/nf-objbase-createbindctx并使用填充值IBindCtx::RegisterObjectParam https://learn.microsoft.com/en-us/windows/win32/api/objidl/nf-objidl-ibindctx-registerobjectparam. See 绑定上下文字符串键 https://learn.microsoft.com/en-us/windows/win32/shell/str-constants以获得这些的完整列表。
并在 MSDN“Old New Thing”博客上详细概述:
Creating a simple pidl: For the times you care enough to send the very fake https://devblogs.microsoft.com/oldnewthing/20130503-00/?p=4463???? https://archive.fo/3yY3i
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)