1

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

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

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

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

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

4

1 回答 1

2

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

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

于 2017-09-18T13:55:48.417 回答