FTP 个 PIDL 的 SHGetNameFromIDList 失败

SHGetNameFromIDList fails for FTP PIDLs

如果我在 Windows 上添加一个 FTP 网络位置,它会创建一个指向该位置的 .lnk 文件。如果我通过 IShellLink 打开 link,获取它的 IShellFile 目标,并将它绑定到 IShellFolder,我可以使用 IShellFolder::EnumObjects 枚举远程位置上的文件(登录后),并返回正确的文件。

但是,如果我尝试通过 SHGetNameFromIDListIShellItem::GetDisplayName 获取其中任何文件的名称,该函数将失败使用 0x80070057(无效参数)HRESULT。我确定 PIDL 是有效的,因为我可以构造 IShellItem,并且它的大小是 72 字节,但是任何获取路径的尝试都失败了。访问由 PIDL 构造的 IShellItem2 上我能想到的任何属性也失败,以及简单地调用 SHGetPathFromIDList.

那么,如何从 PIDL 中获取任何有意义的名称,最好是在 SIGDN_PARENTRELATIVEPARSING 中?为什么所有这些操作都失败了?我以为任何 PIDL 至少是一个文件路径或一个 CLSID,但是这个 PIDL 根本无法查询任何东西。

我知道有很多更好的访问 FTP 的解决方案,但我对 Shell32 一般有这个问题,而不是专门针对 FTP。

我还通过 ILSaveToStream 将 PIDL 转换为字节,我可以看到文件的名称是 definitely

原来 IShellFolder::EnumObjects 返回了相关的 PIDL。由于某些原因,无法获取相关 FTP PIDL 的名称,尽管它们清楚地存储在 SHITEMID.

好吧,在文件夹和文件 PIDL 上调用 ILCombine 让一切都按预期工作。