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