【问题标题】:SHGetNameFromIDList fails for FTP PIDLsFTP PIDL 的 SHGetNameFromIDList 失败
【发布时间】:2017-09-18 11:18:31
【问题描述】:

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

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

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

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

我还通过ILSaveToStream将PIDL转换为字节,我可以看到文件名肯定在那里。

【问题讨论】:

  • This answer 建议 SIGDN_DESKTOPABSOLUTEPARSING 应该可以工作。
  • @zett42 遗憾的是,这也失败并出现同样的错误。

标签: winapi com shell32


【解决方案1】:

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

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

【讨论】:

  • 这里清楚地记录了这一点:msdn.microsoft.com/en-us/library/windows/desktop/bb761983.aspx“数组中返回的 ITEMIDLIST 结构与被枚举的 IShellFolder 相关。”。 pidls 是 100% 不透明的,它们可以包含任何内容,不仅是名称、路径或 CLSID。因此,如果您想使用像 SHGetPathFromIDList 这样的静态方法,您必须将从 EnumObjects 返回的内容与文件夹的绝对 pidl 结合起来。但是,IShellFolder::GetDisplayNameOf 应该与相关 pidls 一起使用(不要与 IShellItem 混淆)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-25
  • 2012-01-09
  • 2017-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多