【发布时间】:2017-09-18 11:18:31
【问题描述】:
如果我在 Windows 上添加一个 FTP 网络位置,它会创建一个指向该位置的 .lnk 文件。如果我通过 IShellLink 打开链接,获取它的 IShellFile 目标,并将其绑定到 IShellFolder,我可以枚举远程位置上的文件(登录后)使用IShellFolder::EnumObjects,并返回正确的文件。
但是,如果我尝试通过 SHGetNameFromIDList 或 IShellItem::GetDisplayName 获取那里的任何文件的名称,该函数将失败并显示 0x80070057(无效参数)结果。我确定 PIDL 是有效的,因为我可以构造 IShellItem,它的大小是 72 字节,但是任何获取路径的尝试都失败了。访问我能想到的由 PIDL 构造的 IShellItem2 上的任何属性也会失败,并且只需调用 SHGetPathFromIDList。
那么,我如何从 PIDL 中获取任何有意义的名称,最好是在 SIGDN_PARENTRELATIVEPARSING 中?为什么所有这些操作都失败了?我认为任何 PIDL 至少是文件路径或 CLSID,但这个 PIDL 根本无法查询任何内容。
我知道访问 FTP 有很多更好的解决方案,但我一般对 Shell32 有这个问题,而不是专门针对 FTP。
我还通过ILSaveToStream将PIDL转换为字节,我可以看到文件名肯定在那里。
【问题讨论】:
-
This answer 建议
SIGDN_DESKTOPABSOLUTEPARSING应该可以工作。 -
@zett42 遗憾的是,这也失败并出现同样的错误。